【问题标题】:how to force delphi compiler to allocate memory for unused variables如何强制delphi编译器为未使用的变量分配内存
【发布时间】: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


【解决方案1】:

这行不通。编译器将优化所有未使用的变量。

您可以做的是定义一个打包记录,如下所示:

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;
  ...

【讨论】:

  • 感谢您费心发布答案。我知道这种可能性(以及另一种可能性,那就是编写提及相关变量的虚拟代码行)并且只是想知道是否有编译器指令或某些 IDE 设置。
  • @miodrag 这只是一种可能性。其他人正在使用数组,或者自己控制堆栈分配(根据大卫的评论)。然而,所有这些可能性都是纯粹的猜测,因为你不会被打扰发布一个 MCVE 来展示你正在尝试实现的目标。
  • @Craig 我想要“LEA EBX,x; MOV [EBX+4],EAX”不要破坏我的 z 变量,而是 y。问题不在于如何做到这一点(我确信有无限的方法),而是是否可以通过编译器开关实现,而无需更改代码。抱歉,我没有更好地指出这一点。
猜你喜欢
  • 1970-01-01
  • 2013-08-29
  • 2013-07-22
  • 1970-01-01
  • 2016-02-08
  • 1970-01-01
  • 2013-07-20
  • 1970-01-01
相关资源
最近更新 更多