У меня есть два идентичных двоичных файла, работающих одновременно в системе Linux (разные аргументы командной строки, поэтому они делают разные вещи). В одном процессе я записываю объект в некоторую область общей памяти; и в другом процессе я получаю объект с правильным размером и получаю указатель на него как void*
, а также static_cast
это указатель оригинального типа.
Это считается безопасным? Объект не обязательно POD.
Это небезопасно, потому что вы не можете memcpy объект, который не trivially_copyable. Например, вы не можете переместить / скопировать std::vector
вызывая memcopy, это может привести к множеству проблем. Однако вы можете создать объект в сегменте общей памяти. Я настоятельно рекомендую рассмотреть буст-межпроцесс даже если вы не используете его, примеры дадут вам представление о том, что возможно: http://www.boost.org/doc/libs/1_63_0/doc/html/interprocess/sharedmemorybetweenprocesses.html.
язык ничего не говорит об общей памяти, так что в этом смысле вопрос не подлежит обсуждению. На практике ограничение на тривиально копируемое является правильной идеей; поскольку разрешено давать такие объекты значения через memcpy
компилятор, как правило, не будет выполнять каких-либо неудачных оптимизаций.
Вы должны следить за загрузкой памяти по разным адресам в разных процессах. Если объект содержит нет указателей, это можно игнорировать. Если это так, вы можете захотеть offset_ptr
.