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 -|
Возможно, потому что он не может хранить сложный тип в этом data_segement. –
Хм, если вы правы, есть ли другой способ совместного использования сложного типа между одной и той же DLL, которые загружаются в несколько процессов? –
Я считаю, что компоновщик будет помещать * статически * инициализированные данные в сегмент данных (вместо .bss). Вы можете создать блок разделяемой памяти, а затем использовать размещение new для размещения там вектора. Вам также понадобится специальный распределитель, который распределяет связанные данные в общей памяти. –