【发布时间】:2017-02-19 01:13:44
【问题描述】:
我意识到(艰难的方式,一个小时的调试)我的 Delphi 2010 编译器关闭优化(并且记录对齐 1 个字节)不会为未使用的变量分配内存。如果它们被定义为:
var x,y,z:longint; a1,a2,a3:whatever;
并且 y 未被使用(实际上,我暂时从项目中删除了一个表单,它专门引用了该变量),然后为 z 分配了 x+4 的地址。很好,只是我有很多代码现在将 z 与 a1 混合。这可以通过一些开关来控制吗?谢谢。
【问题讨论】:
-
这是不可能的。如果您不使用
y,请包含一个minimal reproducible example,以演示将z 与a1 混合的代码。 -
无论您做什么来依赖一致的地址偏移分配都是脆弱且构思不周的。陈述你正在尝试做什么的真正问题,并获得一个更具可读性和可维护性的程序。
-
谢谢。 1)我的可验证示例是在内联汇编程序中,并且帕斯卡中的字节指针增量肯定会产生相同的效果,但是如果没有强制分配的开关,那就没关系了; 2)也许你的标准构思不周,但我讨厌给记录成员加上前缀,所以我将一个指向连续第一个变量的指针传递给我的一些程序;这种习惯既不是愤怒也不是迷恋;简而言之,我的代码中的文字更少,对我来说更具可读性和可维护性,这就是我的大脑的工作方式;没有所谓的“真正的问题”
-
使用 asm 时不要声明变量。使用纯 asm 并自己保留堆栈空间。
-
@DavidHeffernan 为什么?使用编译器保留堆栈并在 asm 代码中命名变量更不容易出错,更易读,更易于维护(如果更改一个变量,则无需重新计算所有堆栈偏移量)。
标签: delphi variables memory allocation