Как я могу позволить моему 32-разрядному приложению Delphi использовать 4 ГБ памяти на 64-разрядных окнах (с помощью Wow64.exe)?

Я на самом деле нашел меня вынужденным использовать goto, потому что я буквально не мог думать о лучшем (более быстром) способе записать этот код:

у меня был сложный объект, и я должен был сделать некоторую операцию на нем. Если бы объект был в одном состоянии, то я мог сделать быструю версию операции, иначе я должен был сделать медленную версию операции. Вещь состояла в том, что в некоторых случаях, посреди медленной операции, было возможно понять, что это, возможно, было сделано с быстрой операцией.

SomeObject someObject;    

if (someObject.IsComplex())    // this test is trivial
{
    // begin slow calculations here
    if (result of calculations)
    {
        // just discovered that I could use the fast calculation !
        goto Fast_Calculations;
    }
    // do the rest of the slow calculations here
    return;
}

if (someObject.IsmediumComplex())    // this test is slightly less trivial
{
    Fast_Calculations:
    // Do fast calculations
    return;
}

// object is simple, no calculations needed.

Это было в скорости критическая часть кода UI в реальном времени, таким образом, я честно думаю, что GOTO был выровнен по ширине здесь.

Hugo

12
задан Mick 4 December 2009 в 20:06
поделиться

4 ответа

См. Эту статью CodeCentral: Использование более 3 ГБ памяти в 32-битной программе Delphi .

В современных версиях Delphi просто добавьте директиву компилятора в dpr: {$ SetPEFlags IMAGE_FILE_LARGE_ADDRESS_AWARE}

12
ответ дан 2 December 2019 в 04:25
поделиться

Используйте директиву компоновщика $ SetPEFlags:

{$SetPEFlags IMAGE_FILE_LARGE_ADDRESS_AWARE}

Константа IMAGE_FILE_LARGE_ADDRESS_AWARE определена в Windows.pas. Я не помню, какая версия Delphi была включена первой.

В Delphi 2007 вы найдете SetPEFlags, описанные в «Флаги заголовков PE (переносимый исполняемый файл) (Delphi)» .

Некоторые полезные IMAGE_FILE_HEADER флаги :

  • {$ SetPEFlags IMAGE_FILE_LARGE_ADDRESS_AWARE} // $ 0020

    Приложение может обрабатывать адреса размером более 2 ГБ.

  • {$ SetPEFlags IMAGE_FILE_NET_RUN_FROM_SWAP} // $ 0800

    Если изображение находится в сети, скопируйте его и запустите из файла подкачки.

  • {$ SetPEFlags IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP }75] // $ 0400 [изображение] 12 находится на съемном носителе, скопируйте его и запустите из файла подкачки.

Некоторые IMAGE_FILE_HEADER флаги :

  • {$ SetPEOptFlags IMAGE_DLLCHARACTERISTICS_NX_COMPAT} // $ 0100

    Изображение совместимо с предотвращением выполнения данных (DEP).

  • {$ SetPEOptFlags IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE} // $ 0040

    DLL может быть перемещена во время загрузки. (также известный как ASLR - рандомизация разметки адресного пространства)

  • {$ SetPEOptFlags IMAGE_DLLCHARACTERISTICS_TERMINAL_SERVER_AWARE} // $ 8000

    Изображение зависит от терминального сервера.

12
ответ дан 2 December 2019 в 04:25
поделиться

Обратите внимание, что в компилятор и RTL заложены предположения, что указатели, интерпретируемые как 32-разрядные целые числа со знаком, никогда не будут отрицательными. Например, компилятор не разрешит создание структуры данных размером более 2 ГБ, а некоторые проверки границ в RTL предполагают, что, например, Index + Count <0 означает переполнение сложения, где Index может быть индексом в массиве байтов. В диспетчере памяти могут возникнуть другие проблемы.

Хорошо проверьте и действуйте на свой страх и риск.

9
ответ дан 2 December 2019 в 04:25
поделиться

. Если вы это сделаете, обязательно используйте FastMM, потому что он поддерживает указатели> 2 ГБ. Ранние менеджеры памяти Delphi не будут работать так хорошо, как уже описывал Барри Келли.

1
ответ дан 2 December 2019 в 04:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: