Boost.Interprocess:测试用例在编译时有或没有优化(GCC)会给出不同的结果
Posted
技术标签:
【中文标题】Boost.Interprocess:测试用例在编译时有或没有优化(GCC)会给出不同的结果【英文标题】:Boost.Interprocess: testcase gives different results if compiled with or without optimization (GCC) 【发布时间】:2011-11-19 12:43:47 【问题描述】:在使用优化进行编译时,我在使用 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 中?
作为记录,我在 GCC 4.6 和 4.5 中观察到这种行为,但在 GCC 4.4 或 Clang 中没有。这里的 Boost 版本是 1.46.1。
编辑:请注意,将 create()
作为单独的函数是必不可少的,这可能表明当 GCC 内联它时会出现问题。
【问题讨论】:
奇怪,当我用他们所谓的等效优化标志替换 -O1 时,它给了死牛。 尝试使用 open_or_create 而不是 create_only? ...另外,请尝试查看程序集,看看有什么不同。 +1 用于检查汇编程序,尤其是在 -O1 和明显的等效优化标志之间。 很遗憾,我不懂汇编程序。 【参考方案1】:正如其他人所建议的,一种解决方案是尝试使用 -O1 -fno.... 找到触发问题所需的最小优化标志集。
其他选项:
使用 Valgrind 看看它会带来什么
尝试使用“-fdump-tree-all”进行编译,这会生成一堆中间编译文件。然后您可以查看编译后的代码是否有任何差异。这些中间文件仍在 C++ 中,因此您无需了解汇编程序。它们几乎是人类可读的,而且肯定是可区分的。
【讨论】:
以上是关于Boost.Interprocess:测试用例在编译时有或没有优化(GCC)会给出不同的结果的主要内容,如果未能解决你的问题,请参考以下文章
boost::interprocess::shared_memory_object::remove 失败
在 Boost Interprocess managed_shared_memory 中搜索时,线程陷入互斥等待
boost::interprocess::string 转换为 char*
boost::interprocess_mutex 与进程本地 boost::mutex
boost::interprocess::interprocess_condition::wait 在等待时不会原子地解锁互斥锁