delphi - 如何保证Delphi例程的16字节代码对齐?

标签 delphi memory-alignment

背景:

我有一个优化的 Delphi/BASM 例程单元,主要用于繁重的计算。其中一些例程包含内部循环,如果循环起始与 DQWORD(16 字节)边界对齐,我可以实现显着的加速。如果我知道例程入口点的对齐情况,我可以确保相关循环按照需要对齐。

据我所知,Delphi 编译器将过程/函数与 DWORD 边界对齐,例如向单元添加功能可能会改变后续功能的对齐方式。然而,只要我将例程的末尾填充为 16 的倍数,我就可以确保后续例程同样对齐或不对齐,具体取决于第一个例程的对齐情况。因此,我尝试将关键例程放在单元实现部分的开头,并在它们之前放置一些填充代码,以便第一个过程将 DQWORD 对齐。

这看起来像下面这样:

interface

procedure FirstProcInUnit;

implementation

procedure __PadFirstProcTo16;
asm
    // variable number of NOP instructions here to get the desired code length
end;

procedure FirstProcInUnit;
asm //should start at DQWORD boundary
    //do something
    //padding to align the following label to DQWORD boundary
    @Some16BAlignedLabel:
        //code, looping back to @Some16BAlignedLabel
    //do something else
    ret #params
    //padding to get code length to multiple of 16
end;

initialization

__PadFirstProcTo16; //call this here so that it isn't optimised out
ASSERT ((NativeUInt(Pointer(@FirstProcInUnit)) AND $0F) = 0, 'FirstProcInUnit not DQWORD aligned');

end.

这有点让人头疼,但我可以在必要时让这种事情发挥作用。问题是,当我在不同的项目中使用这样的单元,或者对同一项目中的其他单元进行一些更改时,这仍然可能会破坏 __PadFirstProcTo16 的对齐。本身。同样,使用不同编译器版本(例如 D2009 与 D2010)重新编译同一项目通常也会破坏对齐。因此,我发现做这类事情的唯一方法是手工,因为当项目的所有其余部分都处于最终形式时,这几乎是最后要做的事情。

问题 1:

是否有其他方法可以达到确保(至少某些特定)例程 DQWORD 对齐的预期效果?

问题2:

影响编译器代码对齐的确切因素是什么?(如何)我可以使用这些特定知识来克服此处概述的问题?

对于这个问题,假设“不用担心代码对齐/相关的可能较小的速度优势”不是一个允许的答案。

最佳答案

从 Delphi XE 开始,代码对齐问题现在可以使用 $CODEALIGN 编译器指令轻松解决(请参阅 this Delphi documentation page ):

{$CODEALIGN 16}
procedure MyAlignedProc;
begin
..
end;

关于delphi - 如何保证Delphi例程的16字节代码对齐?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1852218/

相关文章:

c++ - 更改派生类型的对齐方式

delphi - 使用 Delphi 读取和解析固定宽度文本文件的建议

multithreading - Delphi 2010 中其他线程的执行点

delphi - 在 Delphi 中创建可访问的 UI 组件

Delphi 对 Aero Glass 和 DoubleBuffered 属性的支持 - 发生了什么以及我们如何使用它们?

c - 在 OS X 上使用 -m32 编译 union 的冗余大小

c - __attribute__ 包含一个整数

c++ - 使用指向压缩结构成员的指针时出现编译器警告

delphi - 如何允许在 TDBLookupComboBox 中选择 NULL 值?

visual-studio-2012 - 为什么 vtable 指针在 x86 编译程序上对齐到 8 个字节?