Не думаю, что что-то из этого вполне отвечает на вопрос, заданный оригинальным постером. Возможно, я рискну следующий пример. Предположим, у кого-то есть данные в «bufferA», а кто-то копирует их в «bufferB», а затем модифицирует оба буфера. Теперь проверяются оба буфера и решается скопировать «bufferA» или «bufferB» в «bufferC» и внести дополнительные изменения в «bufferC» и т. Д.
Предполагая, что буферы велики, а модификации малы, вопрос заключается в том, будет ли оптимизирована использование возможности MMU «копировать при записи» на хост-машине, и существует ли API, позволяющий это сделать. .
Использование файлов с отображением в памяти не совсем работает, потому что, как только вы используете PAGE_WRITECOPY, кажется, нет никакого способа сказать «теперь скопируйте виртуальные страницы, содержащие изменения». Например, если «bufferA» и «bufferB» оба были сопоставлениями одного и того же файла, и во время сопоставления одно из них было помечено «WRITECOPY», то, похоже, нет способа отобразить эти модификации в «bufferC». Конечно, можно просто скопировать биты, но вопрос в том, возможна ли оптимизация.
Существует функция VirtualCopy (), но, похоже, она специфична для Windows CE и работает с физическими адресами. Вопрос здесь в том, есть ли что-то вроде «VirtualCopy», но в качестве источника используется виртуальный адрес.
Обратите внимание, что хотя "fork ()" (в системах, в которых он есть) делает это, один "форк" выполняет весь процесс, а не только буфер. Здесь была связанная с этим дискуссия, касающаяся «memcpy при копировании при записи» ( Могу ли я сделать memcpy при записи при записи в Linux? ).
Таким образом, искомый API может выглядеть примерно так:
void * VirualCopyVirtualAddressSpace (void * src, size_t length);
До сих пор я не видел API ни в одной системе, который позволял бы копировать буферы внутри процесса или между существующими процессами. Хотя я не эксперт, я бы подумал, что копирование правильно выровненного сегмента виртуальной памяти с помощью механизма копирования при записи было бы достаточно простым, по крайней мере, в пределах одного адресного пространства.