2017-02-19 22 views
0

Я понял (трудный путь, час отладки), что мой компилятор Delphi 2010 с оптимизацией отключен (и выравнивание записи по 1 байт) не выделяет память для неиспользуемых переменных. Если они определяются как:Как заставить компилятор Delphi выделить память для неиспользуемых переменных

var x,y,z:longint; a1,a2,a3:whatever; 

и у получает неиспользованная (на самом деле, я снял форму из проекта временно, который ссылается на переменную, которая исключительно), то г присваивается адрес х + 4. Ничего, кроме того, что у меня много кода, который теперь будет смешивать z с a1. Можно ли это контролировать с помощью какого-то переключателя? Спасибо.

+1

Это не представляется возможным. Пожалуйста, добавьте [mcve], который демонстрирует * код, который будет смешивать z с a1 *, если вы не используете 'y'. –

+1

Независимо от того, что вы делаете, чтобы полагаться на последовательное назначение смещения адреса, хрупкое и плохо продуманное. Укажите свою реальную проблему о том, что вы пытаетесь сделать, и получите гораздо более читаемую и поддерживаемую программу. –

+0

Thx all. 1) мои проверенные примеры приведены в встроенном ассемблере, и, несомненно, приращение указателя байта в pascal произведет тот же эффект, но если нет никаких переключателей для принудительного распределения, это не имеет значения; 2), плохо продуманные по вашим стандартам, возможно, но я ненавижу префикс записей записей, поэтому я передаю указатель на 1-й var в ряд некоторых моих процедур; эта привычка не является ни яростью, ни фетишем; просто, меньше слов в моем коде, более читабельным и поддерживаемым для меня, вот как работает мой мозг; нет такой вещи, как «реальная проблема» – miodrag

ответ

4

Это не сработает. Компилятор оптимизирует все неиспользуемые переменные.

Что вы можете сделать, это определить уплотненный запись, как таковой:

type 
    TMyData = packed record 
    x,y,z: longing; 
    a1,a2,a3: whatever; 
    end; 

Затем выделенный TMyData всегда будет выделено в качестве одного, включая все внутренние переменные, даже если они не используются в вашем коде ,

Для временных переменных, выделенных на стеке, вы можете использовать:

function DoSomething(); 
var loc: packed record 
     x,y,z: longing; 
     a1,a2,a3: whatever; 
    end; 
begin 
    loc.x := 10; 
    ... 
+0

Спасибо, что потрудились опубликовать ответ. Я знаю об этой возможности (наряду с другой, и это нужно написать фиктивные строки кода, в котором упоминаются соответствующие переменные), и просто задавалось вопросом, есть ли директива компилятора или какой-либо IDE-настройки. – miodrag

+1

@miodrag Это только одна возможность. Другие используют массив или управляют распределением стека самостоятельно (согласно комментарию Давида). Тем не менее, все эти возможности - чистое предположение, потому что *** вы не можете беспокоиться ***, чтобы опубликовать MCVE, демонстрируя, чего вы пытаетесь достичь. –

+0

@Craig я хотел «LEA EBX, x; MOV [EBX + 4], EAX», чтобы не испортить переменную z, но y. вопрос был не в том, как это сделать (я уверен, что есть бесконечные пути), но если это возможно с помощью компилятора, без изменения кода.извините, я не указал на это лучше. – miodrag