Как время жизни объекта C++ взаимодействует с массивами из кода C?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Как время жизни объекта C++ взаимодействует с массивами из кода C?

Сообщение Anonymous »

Справочная информация: я работаю с C++14/C++17 над коммуникационной библиотекой, которая осуществляет связь IPC через общую память. Я хочу, чтобы моя библиотека поддерживала нулевое копирование, чтобы клиенты могли читать и записывать непосредственно в общую память без дополнительных промежуточных буферов (т. е. без memcpy/сериализации). Предположим, что доступ уже синхронизирован, поэтому нет гонок за данными.
Проблема: насколько я понимаю из спецификации C++, то, чего я хочу достичь, невозможно без функций C++23 start_lifetime_as, потому что я не могу начать жизнь моих объектов в общей памяти на стороне потребителя, и даже примитивные типы демонстрируют неопределенное поведение, если программа читает из области памяти без предварительной записи в нее (даже если я записал в память из другой процесс??)
Я просматривал реализацию std::start_lifetime_as() и задавался вопросом, забочусь ли я только о примитивных типах, буду ли я соответствовать спецификации C++, если у меня есть C-функция (в другом модуле компиляции) для "отмывания" моих указателей, например int* launder_int(int* in) { return in; , потому что передача массивов между C и C++ кажется допустимой, например, это используется в некоторых частях libc. В то же время я не могу найти в спецификации C++ ни одного раздела, описывающего, как время существования объекта взаимодействует с функциями, реализованными в коде C, а разделы времени жизни объекта и extern C кажутся противоречивыми, так как же C++ может взаимодействовать с кодом C "правильным" способом?
Предполагая, что мой launder_int работает как задумано, может ли он вообще заменить start_lifetime_as/

Код: Выделить всё

start_lifetime_as_array? Будет ли launder_int
давать больше корректности, чем void* launder_void(void*) + reinterpret_cast?

Подробнее здесь: https://stackoverflow.com/questions/798 ... rom-c-code
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»