powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Инструкции {$SETPEFLAGS $20} или {$SETPEFLAGS IMAGE_FILE_LARGE_ADDRESS_AWARE} и FastMM5
35 сообщений из 35, показаны все 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
Инструкции {$SETPEFLAGS $20} или {$SETPEFLAGS IMAGE_FILE_LARGE_ADDRESS_AWARE} и FastMM5
    #40084706
hlopotun
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov

У DLL свой собственный RTL и, соответстенно, менеджер памяти.

И вообще ты давно уже перекомпилировал бы всё в 64 бита если бы не тратил время на форум.


Сотни модулей, и dll и com итп в том числе тот что только в D5 компилируется. Плюс в куче модулей integer (pointer (self)) а потом обратно в pointer. Инструкция {$O+} тоже встречается минимум в десятке модулей, проверил сегодня.
Если бы всё было так просто. Я уже писал что сей монстр ваяли более 25 лет и не один программист.
По началу ваял шеф и хотел сделать модульную структуру, отсюда куча dll и ocx. Плюс привязка к парадоксу и его dllкам. Например куча данных из dll читаются их парадокса или firebird через свой велосипед с общим интерфейсом и далее передаются в программу в виде dom/xml и потом обратно через свой велосипед засовываются опять же в самописные dataset .... Всё хоть и оптимизированно но намного медленнее чем могло бы быть если бы работали через тот же FireDac напрямую.
Сейчас перечислил, аж сам приуныл. Короче старый проект со всеми вытекающими.
Хоть одно хорошо, куча клиентов и спрыгнуть им особо некуда да и если бы было куда вряд-ли было бы возможно перенести все данные. Поэтому фраза "уже давно перекомпилил бы на х64 тут не подходит". Если бы было так просто уже перекомпилили бы.
Да и кстати, как не смешно, есть ещё динозавры которые на XP сидят, но их можно по идее "убедить" купить что поновее.

такие дела.
...
Рейтинг: 0 / 0
Инструкции {$SETPEFLAGS $20} или {$SETPEFLAGS IMAGE_FILE_LARGE_ADDRESS_AWARE} и FastMM5
    #40084708
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
и это просвещенная Эуропа...
дикари!
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Инструкции {$SETPEFLAGS $20} или {$SETPEFLAGS IMAGE_FILE_LARGE_ADDRESS_AWARE} и FastMM5
    #40084710
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hlopotunЕсли бы всё было так просто. Я уже писал что сей монстр ваяли более 25 лет и не один
программист.

Да зачем тебе монстр если надо всего один модуль импорта? Скопируй его и нещадно откусывай
лишнее.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Инструкции {$SETPEFLAGS $20} или {$SETPEFLAGS IMAGE_FILE_LARGE_ADDRESS_AWARE} и FastMM5
    #40084713
hlopotun
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov

hlopotunЕсли бы всё было так просто. Я уже писал что сей монстр ваяли более 25 лет и не один
программист.

Да зачем тебе монстр если надо всего один модуль импорта? Скопируй его и нещадно откусывай
лишнее.

в этом модуле как раз половина этого "добра" и задействована.
Тут вердикт только один походу. Переписать импорт под firebird + firedac, выкинуть парадокс и прочую муть в виде dll и ocx. Максимум пара недель работы (а может и за неделю уложимся). Почти столь ко же сколько ушло на исследование проблеммы. Если проблемма где и есть то только в понимании бизнес логики штамма артиклей и datanorm формата (тут тоже не всё просто), но тут думаю разберёмся.
...
Рейтинг: 0 / 0
Инструкции {$SETPEFLAGS $20} или {$SETPEFLAGS IMAGE_FILE_LARGE_ADDRESS_AWARE} и FastMM5
    #40084716
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hlopotun
Максимум пара недель работы (а может и за неделю уложимся).

Оптимист.
Это без перерывов на сон и обед?
Бери месяц хотя-бы.
...
Рейтинг: 0 / 0
Инструкции {$SETPEFLAGS $20} или {$SETPEFLAGS IMAGE_FILE_LARGE_ADDRESS_AWARE} и FastMM5
    #40084729
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hlopotun
Инструкция {$O+} тоже встречается минимум в десятке модулей, проверил сегодня.
А проверять нужно {$Q+} или {$OVERFLOWCHECKS ON}
...
Рейтинг: 0 / 0
Инструкции {$SETPEFLAGS $20} или {$SETPEFLAGS IMAGE_FILE_LARGE_ADDRESS_AWARE} и FastMM5
    #40084780
hlopotun
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
_Vasilisk_
hlopotun
Инструкция {$O+} тоже встречается минимум в десятке модулей, проверил сегодня.
А проверять нужно {$Q+} или {$OVERFLOWCHECKS ON}


а как контроль переполнения влияет в данном случае?
С указателями и битом под минус понятно. С с переполнением не совсем.
...
Рейтинг: 0 / 0
Инструкции {$SETPEFLAGS $20} или {$SETPEFLAGS IMAGE_FILE_LARGE_ADDRESS_AWARE} и FastMM5
    #40084822
hlopotun
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
тут человек от абракадабры интересные советы/мысли даёт
...
Рейтинг: 0 / 0
Инструкции {$SETPEFLAGS $20} или {$SETPEFLAGS IMAGE_FILE_LARGE_ADDRESS_AWARE} и FastMM5
    #40084825
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hlopotun
а как контроль переполнения влияет в данном случае?
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
var
  Ptr: Pointer;
  Int: Integer;
begin
  Ptr := Pointer($7FFFFFFF);  // типа GetMem
  Int := Integer(Ptr);
  Inc(Int, 2);
  Ptr := Pointer(Int);  // Ptr = $80000001;
end;

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

ok, спасибо
...
Рейтинг: 0 / 0
35 сообщений из 35, показаны все 2 страниц
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Инструкции {$SETPEFLAGS $20} или {$SETPEFLAGS IMAGE_FILE_LARGE_ADDRESS_AWARE} и FastMM5
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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