Можете ли вы записать двоичное представление объекта в области общей памяти? Да.
Можете ли вы безопасно использовать объект из другой программы, получая доступ к его двоичному представлению, хранящемуся в общей памяти? Иногда, но не в целом.
Правила аналогичны записи двоичного представления для сериализации на диск или по проводам. Вы должны убедиться, что обрабатываете указатели на другие объекты, а также на все элементы, не являющиеся POD. Например, экземпляр std::string
имеет указатель на выделенную память, который:
- может не находиться в области общей памяти
- может не иметь того же адреса в другом процессе (например, данные находятся в общей памяти, но области общей памяти были сопоставлены с разными базовыми адресами в обоих процессах).
Итак, простая эвристика заключается в том, что если X
- это то, что вы не можете:
std::ofstream file("foo.bin",std::ios::binary);
file.write(reinterpret_cast<const char*>(&X), sizeof(X));
Тогда вы не сможете безопасно записать его в общую память.
Примечания : даже если данные относятся к типу POD, вы не можете предполагать, что их запись безопасна. В некоторых операционных системах можно запускать несколько разных типов процессов (например, 32-разрядные и 64-разрядные процессы). В таком случае использование типов, таких как int
, может не совпадать в обоих процессах. Учитывая конкретную операционную систему, конкретный компилятор и конкретные параметры компиляции, может быть возможно найти надежный способ написания таких типов POD. Если это окружение может измениться, избегайте этого, как чумы.