Самое простое решение вашей проблемы - использование 64-битных адресных пространств - современные Mac поддерживают это «из коробки», в Windows и Linux вам необходимо установить 64-битную версию ОС. Я верю, что Qt можно использовать для создания 64-битных приложений. 32-разрядные системы не смогут поддерживать одно выделение того размера, о котором вы говорите - даже Mac с 4 ГБ адресного пространства, доступного для приложений, не сможет выделить 3,7 ГБ, так как не будет быть непрерывным доступным пространством такого размера.
Для отмены я бы посмотрел на использование отображенных в памяти файлов и копирование при записи для копирования блока:
http://en.wikipedia.org/wiki/Copy-on-write
Это означает, что вам на самом деле не нужно копировать все исходные данные, система сделает копии страниц по мере их записи. Это значительно повысит производительность, если ваши изображения значительно больше реальной памяти и вы не меняете каждую часть изображения. Похоже, boost :: map_file с «приватным» доступом может быть полезным для этого.
Если вам действительно нужно поддерживать 32-битные системы, ваша единственная альтернатива - каким-то образом разбить эти большие блоки, обычно на плоскости или субтомы. С обоими ужасно работать, когда дело доходит до применения 3D-фильтров и т. Д., Хотя, так что я бы действительно избежал этого, если бы вы могли.
Если вы пойдете по пути к дополнительным томам, одна хитрость заключается в том, чтобы сохранить все вложенные тома в отображенных в память файлах и отобразить их в свое адресное пространство только тогда, когда они вам нужны. Когда они не отображаются в адресном пространстве, они должны оставаться в объединенном буферном кеше до тех пор, пока не будут очищены, это фактически означает, что вы можете использовать больше оперативной памяти, чем у вас есть адресное пространство (особенно в Windows, где 32-разрядные приложения по умолчанию получают только 2 ГБ адресного пространства) .
Наконец, в 32-битной Windows вы также можете посмотреть на ключ / 3GB в boot.ini. Это позволяет выделить приложениям 3 ГБ адресного пространства, а не 2 ГБ. Из проблемы, которую вы описываете, я не думаю, что это даст вам достаточно адресного пространства, однако может помочь вам с некоторыми меньшими объемами. Обратите внимание, что ключ / 3GB может вызвать проблемы с некоторыми драйверами, поскольку он уменьшает объем адресного пространства, доступного для ядра.