{$IFOPT A4}?

4
在Delphi 2009(或早期版本)中,如何在代码中检查“Align”编译选项? IFOPT 指令似乎只适用于纯开关({$IFOPT A4} 不会编译)。
我找不到等效的常量或定义({$IF Align = 4} 或类似)。
4个回答

12

你可以通过定义一个具有已知打包规则的记录,并使用SizeOf进行检查来实现此目的。在Delphi 2009中测试过:

type
  TTestRec = record
    A: Byte;
    B: Int64;
  end;

{$IF SIZEOF(TTestRec) = 9}
  {$MESSAGE HINT '$A1'}
{$ELSEIF SIZEOF(TTestRec) = 10}
  {$MESSAGE HINT '$A2'}
{$ELSEIF SIZEOF(TTestRec) = 12}
  {$MESSAGE HINT '$A4'}
{$ELSEIF SIZEOF(TTestRec) = 16}
  {$MESSAGE HINT '$A8'}
{$ELSE}
  {$MESSAGE HINT 'Unknown alignment'}
{$IFEND}

谢谢你的回答。我们是否可以确保编译器对非打包记录和放置在堆栈上的局部变量以完全相同的方式处理?(我当然希望如此,但在测试编译器在其他功能上的行为时,我曾经遇到过一些意外情况...) - LeGEC

2
编写测试代码以测试实际运行行为。这是我能想到的唯一方法。

1

有{$IFOPT A+}指令,但它并没有告诉你对齐值。


-1

我相信没有办法做到这一点 :(


我同意。我也不知道有什么方法可以做到这一点。 (不确定为什么你需要这样做; 我想不出任何理由你需要在编译时知道这个,或者如果你知道了,你会在代码中做出什么不同的事情。) - Ken White
2
某些任务仅适用于正确对齐的值。许多SIMD指令就是这样,例如... - Mason Wheeler
@Mason:没错,但为什么不直接要求或强制正确对齐,并在出现错误对齐时执行处理器执行的相同操作,即抛出异常? - Mihai Limbășan
1
尝试实现Allen Bauer的想法创建通用组播事件时,我们发现了几个错误,其中包括ObjAuto.pas文件中的错误。例如,他的解决方案意味着在运行时从一个方法(及其TypeInfo)创建一个TMethodPointer,使用ObjAuto.CreateMethodPointer。该函数通过嵌套调用(第726行)错误地假设本地变量和参数未对齐。为了修复此问题,例如,我们需要知道对齐大小。Allen Bauer的原帖:http://blogs.embarcadero.com/abauer/2008/08/15/38865#comment-11698 - LeGEC
我正在使用智能记录来生成4对齐和8对齐的值。请参见我的GpStuff单元中的TGp4AlignedInt和TGp8AlignedInt64(最新版本位于http://code.google.com/p/omnithreadlibrary/source/browse/trunk/src/GpStuff.pas)。 - gabr

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接