在C 中顺序对齐函数

Aligning functions sequentially in C++

本文关键字:对齐 函数 顺序      更新时间:2023-10-16

想象我有以下代码

void A(){
// blah blah blah
}
void B(){
// blah blah blah
}
void C(){
// blah blah blah
}

当代码的编译(使用Visual Studio)并加载到内存中以执行时,a(),b(),c()的地址可能不会按顺序排列。我们如何让他们订购?在这种情况下有任何指令有用吗?

如果您的程序由单个翻译单元(源文件)组成,则结果二进制通常应包含在翻译单元中定义的顺序中的功能。例如,考虑以下程序:

int A() { return  0; }
int B() { return  1; }
int C() { return -1; }
int main() { return A() + B() + C(); }

如果您对最小尺寸(/o1)进行了优化和内联函数扩展(/ob0)的编译,则会产生以下机器代码:

int A() { return  0; }
00F71000 33 C0                xor         eax,eax  
00F71002 C3                   ret  
int B() { return  1; }
00F71003 33 C0                xor         eax,eax  
00F71005 40                   inc         eax  
00F71006 C3                   ret  
int C() { return -1; }
00F71007 83 C8 FF             or          eax,0FFFFFFFFh  
00F7100A C3                   ret  
int main() { return A() + B() + C(); }
00F7100B E8 F0 FF FF FF       call        A (0F71000h)  
00F71010 8B C8                mov         ecx,eax  
00F71012 E8 EC FF FF FF       call        B (0F71003h)  
00F71017 03 C8                add         ecx,eax  
00F71019 E8 E9 FF FF FF       call        C (0F71007h)  
00F7101E 03 C1                add         eax,ecx  
00F71020 C3                   ret  

源注释由调试器提供。当使用其他优化设置时,需要对最小尺寸的优化来消除在功能之间放置的int 3填充。必须禁用内联函数扩展,以确保函数实际上存在于生成的二进制中。

据我所知,这是实施细节,因此不应在生产代码中依靠。

如果您确实将它们拆分为单独的功能,以使其可读性,并且在整个程序中只称其为一次 - 声明这些函数内联,因此编译器将它们组合成一个单个部分没有任何通话说明的代码。

否则,没有理由将它们顺序放置在内存中,因为任何呼叫指令都会冲洗CPU管道。