在使用优化进行编译时,我遇到了Boost.Interprocess分配器的麻烦。我设法把它变成了40行的测试用例,其中大部分是样板。只需查看下面代码中的create()
和main()
函数即可。
#include <iostream>
#include <boost/interprocess/allocators/allocator.hpp>
#include <boost/interprocess/managed_shared_memory.hpp>
namespace interp = boost::interprocess;
struct interp_memory_chunk
{
interp::managed_shared_memory chunk;
interp_memory_chunk ()
{
interp::shared_memory_object::remove ("GCC_interprocess_test");
chunk = interp::managed_shared_memory (interp::create_only, "GCC_interprocess_test", 0x10000);
}
~interp_memory_chunk ()
{
interp::shared_memory_object::remove ("GCC_interprocess_test");
}
};
typedef interp::allocator <int, interp::managed_shared_memory::segment_manager> allocator_type;
inline void
create (allocator_type& allocator, allocator_type::value_type& at, int value)
{
allocator.construct (allocator.address (at), value);
}
int
main ()
{
interp_memory_chunk memory;
allocator_type allocator (memory.chunk.get_segment_manager ());
allocator_type::pointer data = allocator.allocate (1);
create (allocator, *data, 0xdeadbeef);
std::cout << std::hex << *data << "\n";
}
编译此时没有优化:
g++ interprocess.cpp -lboost_thread -o interprocess
并且正在运行,输出为deadbeef
,正如预期的那样。
但是,在使用优化编译时:
g++ -O1 interprocess.cpp -lboost_thread -o interprocess
正在投放0
,不是预期的内容。
所以,我不确定问题出在哪里。这是我程序中的错误,即我是否调用了一些UB?这是Boost.Interprocess中的错误吗?或者也许在海湾合作委员会?
为了记录,我观察到GCC 4.6和4.5的这种行为,但不是GCC 4.4或Clang。 Boost版本在这里是1.46.1。
编辑:请注意,将create()
作为单独的函数是必不可少的,这可能表明当GCC内联时会出现问题。
答案 0 :(得分:0)
正如其他人所建议的,一种解决方案是尝试使用-O1 -fno ....找到触发问题所需的最小化优化标记集。
其他选择:
使用Valgrind,看看它出现了什么
尝试使用“-fdump-tree-all”进行编译,这会生成一堆中间编译文件。然后,您可以查看已编译的代码是否存在任何差异。这些中间文件仍然是C ++,因此您不需要知道汇编程序。它们几乎是人类可读的,当然也很难辨。