Увеличьте тип общей памяти

Я пытаюсь сделать следующее:

Создайте «большой» массив (1 000 000 + объектов) в общей памяти с помощью библиотеки boost::interprocess.

Мой код содержит следующее:

managed_shared_memory testarray(create_only, "Test", 45000000);

typedef std::pair<SingleField, uint32_t> TestType;
TestType * test = testarray.construct<TestType>("TestArray")[45000000];

У меня вопрос: как определить тип возвращаемого значения этой функции повышения?

Если я сделаю то же самое со следующим: SingleField вместо "::pair", это не сработает, но мне не нужен второй контейнер, мне нужен только один, но с одним он не работает!

Вывод eclipse для меня как-то слишком загадочен. Поскольку я работаю с boost, меня несколько раз останавливали из-за таких проблем, есть ли простой способ выяснить, какой «Тип» функция вернет? (Я пришел из Java, поэтому я привык иметь какое-то «простое» определение, в котором говорится Object x ). Я был бы действительно счастлив, если бы мог выяснить тип, который возвращает конкретная функция, со всеми функциями, которые я пишу для себя, это просто, но с этой библиотекой у меня проблемы.

Второй вопрос: почему эти примеры всегда с парой "тип", это предварительное условие библиотеки?

-> Я пытался использовать #include , Eclipse сообщает мне, что это std::pair Вопрос в том, почему это T* ? Это адрес начального сегмента?

Спасибо за ваше время и ответы.

Выход затмения:

Multiple markers at this line
- unused variable test
- cannot convert const 
 boost::interprocess::detail::named_proxy<boost::interprocess::segment_manager<char, 
 boost::interprocess::rbtree_best_fit<boost::interprocess::mutex_family, 
 boost::interprocess::offset_ptr<void>, 0ul>, boost::interprocess::iset_index>, Field, false> to 
 SharedMemoryInitializer::Create()::TestType* in initialization

Я несколько раз читал руководства по библиотеке boost, возможно, я смотрю не на те сайты или страницы, и я был бы рад, если бы вы предоставили информацию, которую я пропустил.

http://www.boost.org/doc/libs/1_42_0/doc/html/interprocess/quick_guide.html#interprocess.quick_guide.qg_interprocess_container


person Oliver    schedule 07.04.2012    source источник
comment
Раньше я не использовал Boost.Interprocess, но если вам нужно получить возвращаемый тип функции в C++, вы всегда можете использовать decltype или std::result_of. См. здесь для получения дополнительной информации: stackoverflow.com/ вопросы/2689709/.   -  person void-pointer    schedule 08.04.2012
comment
Так что это в основном то, что используется в новом стандарте С++, я пытался использовать ключевое слово auto, я думаю, моя версия не соответствует новому стандарту С++, я попробую с decltype   -  person Oliver    schedule 08.04.2012
comment
Возможно, вам придется указать дополнительные флаги компиляции, чтобы компилятор использовал последний стандарт. Для g++-4.6 вы можете использовать -std=c++0x, а также -std=c++11 в g++-4.7.   -  person void-pointer    schedule 08.04.2012
comment
Спасибо, что сказали мне, к сожалению, у меня 4.5.x :(   -  person Oliver    schedule 08.04.2012
comment
Если вы не вынуждены использовать g++-4.5, я настоятельно рекомендую вам обновить ваш компилятор. Более поздние версии g++ поставляются с лучшими возможностями оптимизации, а новые функции C++11 действительно делают работу намного удобнее. Тем не менее, вы пробовали смотреть исходный код?   -  person void-pointer    schedule 08.04.2012
comment
Привет, void-pointer, спасибо за вашу постоянную поддержку, я посмотрю, смогу ли я обновить компилятор, мне кажется, что ошибка объясняет, что он использует указатель смещения, как обычный ram alloc [obj1][obj2].. этот массив только кажется, что это массив указателей на разделяемую память, но мне нужны настоящие объекты разделяемой памяти   -  person Oliver    schedule 09.04.2012


Ответы (1)


С моей точки зрения, в вашем коде есть две основные проблемы:

  • кажется, вы выделяете 45000000 объектов типа TestType, что, вероятно, не то, что вам нужно (если только TestType не требуется только один байт для каждого экземпляра):

    TestType * test = testarray.construct<TestType>("TestArray")[45000000];

  • в соответствии с документацией (*) вы должны предоставить круглые скобки для вызова конструктора (вы используете вторую версию): TestType * test = testarray.construct<TestType>("TestArray")[45000000]();

    Я предполагаю, что TestType имеет конструктор без параметров.

(*) http://www.boost.org/doc/libs/1_46_1/doc/html/interprocess/managed_memory_segments.html#interprocess.managed_memory_segments.managed_memory_segment_features.allocation_types

person Andre    schedule 14.05.2012
comment
Спасибо за ваш ответ, основной ошибкой было 45 000 000, я думал, что это байты, но на самом деле это объекты - person Oliver; 15.05.2012