Boost.Interprocess:如果使用或不使用优化(GCC)进行编译,testcase会给出不同的结果

时间:2011-11-19 12:43:48

标签: c++ gcc interprocess

在使用优化进行编译时,我遇到了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内联时会出现问题。

1 个答案:

答案 0 :(得分:0)

正如其他人所建议的,一种解决方案是尝试使用-O1 -fno ....找到触发问题所需的最小化优化标记集。

其他选择:

  1. 使用Valgrind,看看它出现了什么

  2. 尝试使用“-fdump-tree-all”进行编译,这会生成一堆中间编译文件。然后,您可以查看已编译的代码是否存在任何差异。这些中间文件仍然是C ++,因此您不需要知道汇编程序。它们几乎是人类可读的,当然也很难辨。