У меня проблемы с распределителями 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
running дает 0
, not что ожидается.
Итак, я не уверен, где проблема.Это ошибка в моей программе, то есть я вызываю UB?Это ошибка в Boost.Interprocess?Или, может быть, в GCC?
Для записи, я наблюдаю это поведение с GCC 4.6 и 4.5, но не с GCC 4.4 или Clang.Ускоренная версия - 1.46.1.
РЕДАКТИРОВАТЬ: Обратите внимание, что наличие create()
в качестве отдельной функции является существенным, что может указывать на то, что проблема возникает, когда GCC вставляет ее.