2013-08-12 3 views
3

InformationСохранение вектора в сегменте данных DLL

следующее предупреждение:
LINK : warning LNK4039: section '.SHARED' specified with /SECTION option does not exist
всегда происходит всякий раз, когда я пытаюсь сохранить вектор в сегменте данных динамически подключаемой библиотеки в C++.

Для примера:

#include <vector> 

struct Obj { 
    unsigned int A; 
    unsigned int B; 
    bool C; 
    std::vector< unsigned char > D; 
}; 

#pragma data_seg(".SHARED") 
std::vector<Obj> Objects; 
#pragma data_seg() 

#pragma comment (linker,"/section:.SHARED,RWS") 

Однако, если я пытаюсь сохранить простую переменную, не будет никаких предупреждений, на компиляции. Как это:

#pragma data_seg (".SHARED") 
int SimpleVariable = 0; 
#pragma data_seg() 

Я не абсолютно уверен, но, я считаю, что предупреждение было вызвано не инициализирует вектор? Если да, то как мы могли бы инициализировать вектор, который будет храниться в сегменте данных?

У меня есть еще один вопрос, это страшная идея хранить вектор в сегменте данных в DLL?

Моя цель

Я пытаюсь разделить содержание вектора внутри DLL, который будет загружен в несколько различных процессов.

Как это:

process_1.exe 
    - example.dll -| * access the same vector (SomeVector) as 
        |  example.dll within process_2 
        | 
       std::vector SomeVector; // vector in example.dll 
        | 
process_2.exe  | * access the same vector (SomeVector) as 
        |  example.dll within process_1 
    - example.dll -|  
+0

Возможно, потому что он не может хранить сложный тип в этом data_segement. –

+0

Хм, если вы правы, есть ли другой способ совместного использования сложного типа между одной и той же DLL, которые загружаются в несколько процессов? –

+2

Я считаю, что компоновщик будет помещать * статически * инициализированные данные в сегмент данных (вместо .bss). Вы можете создать блок разделяемой памяти, а затем использовать размещение new для размещения там вектора. Вам также понадобится специальный распределитель, который распределяет связанные данные в общей памяти. –

ответ

0

http://msdn.microsoft.com/en-us/library/h90dkhs0(v=vs.90).aspx

И как СТАНД :: вектор <> инициализируется?

Да, это ужасная идея использовать общий сегмент данных.

Поскольку выполнение кода находится в пространстве процесса этой программы, вы по умолчанию будете выделять память для своего вектора из этого адресного пространства процессов. В котором любой другой процесс будет генерировать исключение, пытающееся прочитать или написать.

Вы можете написать свой собственный _alloc, чтобы извлечь из общей памяти системы, но это не решит ваши проблемы с инициализацией.

Рекомендуемый метод для ipc - это файлы с отображением памяти и mutex's.

Чтобы это работало так, как вы хотите, потребуется много кода. Получите удобный просмотр кода Std: Vector, пока вы не сможете получить класс из этого шаблона, или выберите более быстрый маршрут, и напишите свой собственный с нуля.