Я на самом деле нашел меня вынужденным использовать 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
См. Эту статью CodeCentral: Использование более 3 ГБ памяти в 32-битной программе Delphi .
В современных версиях Delphi просто добавьте директиву компилятора в dpr:
{$ SetPEFlags IMAGE_FILE_LARGE_ADDRESS_AWARE}
Используйте директиву компоновщика $ 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
Обратите внимание, что в компилятор и RTL заложены предположения, что указатели, интерпретируемые как 32-разрядные целые числа со знаком, никогда не будут отрицательными. Например, компилятор не разрешит создание структуры данных размером более 2 ГБ, а некоторые проверки границ в RTL предполагают, что, например, Index + Count <0
означает переполнение сложения, где Index
может быть индексом в массиве байтов. В диспетчере памяти могут возникнуть другие проблемы.
Хорошо проверьте и действуйте на свой страх и риск.
. Если вы это сделаете, обязательно используйте FastMM, потому что он поддерживает указатели> 2 ГБ. Ранние менеджеры памяти Delphi не будут работать так хорошо, как уже описывал Барри Келли.