从Boost::Interprocess中移除RTTI

Removing RTTI from Boost::Interprocess

本文关键字:RTTI Interprocess Boost      更新时间:2023-10-16

我正在尝试使用Boost::Interprocess共享内存。但是,我的程序也需要使用LLVM, LLVM需要fno-rtti,而Boost::Interprocess需要RTTI。具体来说,我尝试了这里的第一个示例,并且得到了编译错误:

/usr/include/boost/interprocess/detail/in_place_interface.hpp:50:71: error: cannot use typeid with -fno-rtti: in_place_interface(::boost::alignment_of::value, sizeof(T), typeid(T).name())

我的解决方案是浏览Boost::进程间头并将每个typeid().name()替换为字符串常量"sometype"。该示例现在可以很好地编译和运行(据我所知)。我不太理解的印象是Boost::Interprocess使用typennames来索引映射,作为加速查找的优化。在我的印象中,将所有类型名更改为常量会降低性能,但不会影响正确性。

如果我不从Boost::Interprocess中删除RTTI,我将被迫使用其他进程间库,因为这一页没有给我太多混合RTTI和非RTTI的希望。

这是替换,nuking RTTI在Boost::进程间头替换typeid与常量字符串,好吗?我担心不正确的行为,比如Boost使用类型id来确定调用哪个析构函数,或者其他类似的问题。我在一个单一开发者,单一用途的虚拟机上。

我也有同样的问题。最后,我用LLVM_ENABLE_RTTI=ON重新编译LLVM来解决这个问题。