powered by simpleCommunicator - 2.0.50     © 2025 Programmizd 02
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Инструкции {$SETPEFLAGS $20} или {$SETPEFLAGS IMAGE_FILE_LARGE_ADDRESS_AWARE} и FastMM5
25 сообщений из 35, страница 1 из 2
Инструкции {$SETPEFLAGS $20} или {$SETPEFLAGS IMAGE_FILE_LARGE_ADDRESS_AWARE} и FastMM5
    #40084398
hlopotun
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем доброго вечера,

работают ли инструкции {$SETPEFLAGS $20} или {$SETPEFLAGS IMAGE_FILE_LARGE_ADDRESS_AWARE} (по идее позволяющие выйти за пределы 2Гб в x32 приложениях) с FastMM5 и как это проверить?
Попробовал на паре проектов но непонятно есть эффект или нет (например в проекте в котором есть Out of Memory проблемма осталась) .
Как правильно количественно определить эффект от этих инструкций?

Спасибо
...
Рейтинг: 0 / 0
Инструкции {$SETPEFLAGS $20} или {$SETPEFLAGS IMAGE_FILE_LARGE_ADDRESS_AWARE} и FastMM5
    #40084405
Фотография DarkMaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hlopotun,

Сказать версию Delphi прежде всего.
...
Рейтинг: 0 / 0
Инструкции {$SETPEFLAGS $20} или {$SETPEFLAGS IMAGE_FILE_LARGE_ADDRESS_AWARE} и FastMM5
    #40084406
zedxxx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
hlopotun, Проверить очень легко - напишите тестовый цикл

Код: pascal
1.
2.
for I := 0 to 199 do 
  GetMemory(16*1024*1024); // 16Mb * 200 = 3200 Mb



если в ходе выполнения программа не упадёт, значит опция работает.
...
Рейтинг: 0 / 0
Инструкции {$SETPEFLAGS $20} или {$SETPEFLAGS IMAGE_FILE_LARGE_ADDRESS_AWARE} и FastMM5
    #40084407
hlopotun
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
DarkMaster
hlopotun,

Сказать версию Delphi прежде всего.


10.4.1
...
Рейтинг: 0 / 0
Инструкции {$SETPEFLAGS $20} или {$SETPEFLAGS IMAGE_FILE_LARGE_ADDRESS_AWARE} и FastMM5
    #40084408
hlopotun
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
zedxxx
hlopotun, Проверить очень легко - напишите тестовый цикл

Код: pascal
1.
2.
for I := 0 to 199 do 
  GetMemory(16*1024*1024); // 16Mb * 200 = 3200 Mb



если в ходе выполнения программа не упадёт, значит опция работает.


да, тест прошел успешно
...
Рейтинг: 0 / 0
Инструкции {$SETPEFLAGS $20} или {$SETPEFLAGS IMAGE_FILE_LARGE_ADDRESS_AWARE} и FastMM5
    #40084409
hlopotun
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
какие проблемы потенциально может вызвать использование этой опции?
...
Рейтинг: 0 / 0
Инструкции {$SETPEFLAGS $20} или {$SETPEFLAGS IMAGE_FILE_LARGE_ADDRESS_AWARE} и FastMM5
    #40084411
zedxxx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
hlopotun, Может вызвать AV, если с указателями работаете как с интами.
...
Рейтинг: 0 / 0
Инструкции {$SETPEFLAGS $20} или {$SETPEFLAGS IMAGE_FILE_LARGE_ADDRESS_AWARE} и FastMM5
    #40084483
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
zedxxx
hlopotun, Может вызвать AV, если с указателями работаете как с интами.
С какого перепугу?
...
Рейтинг: 0 / 0
Инструкции {$SETPEFLAGS $20} или {$SETPEFLAGS IMAGE_FILE_LARGE_ADDRESS_AWARE} и FastMM5
    #40084485
ъъъъъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
_Vasilisk_,

от огорчения... :)
...
Рейтинг: 0 / 0
Инструкции {$SETPEFLAGS $20} или {$SETPEFLAGS IMAGE_FILE_LARGE_ADDRESS_AWARE} и FastMM5
    #40084488
zedxxx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
_Vasilisk_, Приведение беззнакового типа (Pointer), к знаковому (Integer) чревато переполнением последнего. И если затем выполнить некоторый инкремент/декремент этого числа и обратное приведение, можете получить указатель, который будет указывать абы куда.

Безопасный тип для приведения указателей в число и обратно - NativeUInt .
...
Рейтинг: 0 / 0
Инструкции {$SETPEFLAGS $20} или {$SETPEFLAGS IMAGE_FILE_LARGE_ADDRESS_AWARE} и FastMM5
    #40084490
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
zedxxx
к знаковому (Integer) чревато переполнением последнего.
И что?
zedxxx
И если затем выполнить некоторый инкремент/декремент этого числа и обратное приведение, можете получить указатель, который будет указывать абы куда.
А если подумать? А еще лучше записать на бумажке
zedxxx
Безопасный тип для приведения указателей в число и обратно - NativeUInt .
Он безопасен только тем, что меняет свой размер в зависимости от платформы
...
Рейтинг: 0 / 0
Инструкции {$SETPEFLAGS $20} или {$SETPEFLAGS IMAGE_FILE_LARGE_ADDRESS_AWARE} и FastMM5
    #40084494
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
zedxxx
Приведение беззнакового типа (Pointer), к знаковому (Integer) чревато переполнением последнего.

Это может доставить проблемы только тогда, когда включён контроль переполнения ({$O+} или как его там). Но я уже лет тридцать как не видел его включённым.

zedxxx
И если затем выполнить некоторый инкремент/декремент этого числа и обратное приведение, можете получить указатель, который будет указывать абы куда.

RTFM Дополнительный код .
...
Рейтинг: 0 / 0
Инструкции {$SETPEFLAGS $20} или {$SETPEFLAGS IMAGE_FILE_LARGE_ADDRESS_AWARE} и FastMM5
    #40084500
northener
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
zedxxx
_Vasilisk_, Приведение беззнакового типа (Pointer), к знаковому (Integer) чревато переполнением последнего. И если затем выполнить некоторый инкремент/декремент этого числа и обратное приведение, можете получить указатель, который будет указывать абы куда.

Пример такого можете привести?
...
Рейтинг: 0 / 0
Инструкции {$SETPEFLAGS $20} или {$SETPEFLAGS IMAGE_FILE_LARGE_ADDRESS_AWARE} и FastMM5
    #40084503
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Проблема в арифметике указателей, действительно, есть.
Но она не в области знаков +- типа, к которому приводим,
и даже не в самом приведении типа, как таковом.

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

Позвольте продемонстрировать оба случая на примерах.

Пример 1.
Приводим адрес к менее широкому целочисленному типу,
например, к байту, а потом приводим полученный результат
снова к адресу.
Совершенно очевидно, что указатель будет испорчен.

Пример 2.
Похожая ситуация может возникать при адресных вычислениях
в алгоритмах поиска, сортировок и т.п.
Пусть у нас 32-битные адреса.
Пусть у нас есть массив 256 байтов по адресу a0=$FFFF0000.
Последний байт этого массива лежит по адресу a2=$FFFF00FF.
Очевидно, что "средний" байт находится по адресу a1=$FFFF007F.

Однако, адрес "среднего" байта нельзя искать по формуле
a1:=(a0+a2) shr 1,
т.к. при сложении будет потерян старший бит результата.

Правильно так:
a1:=a0+(a2-a0) shr 1.
...
Рейтинг: 0 / 0
Инструкции {$SETPEFLAGS $20} или {$SETPEFLAGS IMAGE_FILE_LARGE_ADDRESS_AWARE} и FastMM5
    #40084529
Lisichkin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Важное уточнение:
{$SETPEFLAGS $20} или {$SETPEFLAGS IMAGE_FILE_LARGE_ADDRESS_AWARE}
позволяет получить доступ к 4Gb памяти для 32-х битных приложений только в 64 битных OS.
...
Рейтинг: 0 / 0
Инструкции {$SETPEFLAGS $20} или {$SETPEFLAGS IMAGE_FILE_LARGE_ADDRESS_AWARE} и FastMM5
    #40084576
hlopotun
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
zedxxx
hlopotun, Может вызвать AV, если с указателями работаете как с интами.


Примерно так?:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
........
  Unr := 0;
  FSerial := integer (Pointer (self));
  
  TAVPZSerializableObject (Pointer (FSerial)).Link          := Source.Link;
  TAVPZSerializableObject (Pointer (FSerial)).Status        := Source.Status;
..........



или так:
Код: pascal
1.
2.
3.
........
      DA31Export (Application.Handle, integer (pointer (self)), ObjCount,
........
...
Рейтинг: 0 / 0
Инструкции {$SETPEFLAGS $20} или {$SETPEFLAGS IMAGE_FILE_LARGE_ADDRESS_AWARE} и FastMM5
    #40084579
hlopotun
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
тут интересно пишут на эту тему
...
Рейтинг: 0 / 0
Инструкции {$SETPEFLAGS $20} или {$SETPEFLAGS IMAGE_FILE_LARGE_ADDRESS_AWARE} и FastMM5
    #40084600
hlopotun
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Lisichkin
Важное уточнение:
{$SETPEFLAGS $20} или {$SETPEFLAGS IMAGE_FILE_LARGE_ADDRESS_AWARE}
позволяет получить доступ к 4Gb памяти для 32-х битных приложений только в 64 битных OS.


т.е. надо делать так?
Код: pascal
1.
2.
3.
4.
5.
.......
  {$IFDEF WIN64}
    {$SETPEFLAGS $20}
  {$ENDIF}
.......


или на 32битной ОС $SETPEFLAGS просто не будет работать и к ошибке не приведёт?
(неначем проверить, нет 32битной ОС).
...
Рейтинг: 0 / 0
Инструкции {$SETPEFLAGS $20} или {$SETPEFLAGS IMAGE_FILE_LARGE_ADDRESS_AWARE} и FastMM5
    #40084602
hlopotun
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
нет, так наверное нельзя. WIN64 это тупо под какую платформу компилируем. Поэтому {$IFDEF WIN64} тут тупо не имеет смысла если компилим под x32.
...
Рейтинг: 0 / 0
Инструкции {$SETPEFLAGS $20} или {$SETPEFLAGS IMAGE_FILE_LARGE_ADDRESS_AWARE} и FastMM5
    #40084617
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
type
   WinIsWow64 = function(Handle: THandle; var Iret: BOOL): Windows.BOOL; stdcall;

function RunOnX64: Boolean;
var
   HandleTo64BitsProcess: WinIsWow64;
   Iret: Windows.BOOL;
begin
   Result := False;
   HandleTo64BitsProcess := GetProcAddress(GetModuleHandle('kernel32.dll'), 'IsWow64Process');
   if Assigned(HandleTo64BitsProcess) then
     begin
       if not HandleTo64BitsProcess(GetCurrentProcess, Iret) then
         raise Exception.Create('Invalid handle');
       Result := Iret;
     end;
end;



Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Инструкции {$SETPEFLAGS $20} или {$SETPEFLAGS IMAGE_FILE_LARGE_ADDRESS_AWARE} и FastMM5
    #40084629
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мимопроходящий,

А смысл, если ему нужно флаг при линковке поставить
...
Рейтинг: 0 / 0
Инструкции {$SETPEFLAGS $20} или {$SETPEFLAGS IMAGE_FILE_LARGE_ADDRESS_AWARE} и FastMM5
    #40084664
hlopotun
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
_Vasilisk_
Мимопроходящий,

А смысл, если ему нужно флаг при линковке поставить


да, тут надо как то по другому выкрутиться. Если вообще надо выкручиваться (т.е. если {$SETPEFLAGS $20} при запуске на х32 вызывает ошибку. А вызывает она ошибку или нет непонятно). У когонибуть есть XP? Проверьте, есть ошибка при использовании FastMM5 и {$SETPEFLAGS $20} или нет. То что 3Гб выделяться не будет это понятно.
...
Рейтинг: 0 / 0
Инструкции {$SETPEFLAGS $20} или {$SETPEFLAGS IMAGE_FILE_LARGE_ADDRESS_AWARE} и FastMM5
    #40084665
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
19.07.2021 14:51, hlopotun пишет:
> У когонибуть есть XP?

ХР тоже бывает х64
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Инструкции {$SETPEFLAGS $20} или {$SETPEFLAGS IMAGE_FILE_LARGE_ADDRESS_AWARE} и FastMM5
    #40084675
hlopotun
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
кстати, если в проекте есть модуль который компилируется в dll ешё в 5й версии Delphi (генератор отчётов привязанным к старой версии delphi/без исходников) то про FastMM5 и {$SETPEFLAGS $20} скорее всего можно забыть или его можно заставить работать со своим менеджером памяти?
наверное вопрос разделения памяти между модулями стооит выделить в отдельную тему.
...
Рейтинг: 0 / 0
Инструкции {$SETPEFLAGS $20} или {$SETPEFLAGS IMAGE_FILE_LARGE_ADDRESS_AWARE} и FastMM5
    #40084681
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У DLL свой собственный RTL и, соответстенно, менеджер памяти.

И вообще ты давно уже перекомпилировал бы всё в 64 бита если бы не тратил время на форум.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
25 сообщений из 35, страница 1 из 2
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Инструкции {$SETPEFLAGS $20} или {$SETPEFLAGS IMAGE_FILE_LARGE_ADDRESS_AWARE} и FastMM5
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]