在C 中顺序对齐函数
Aligning functions sequentially in C++
想象我有以下代码
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管道。
相关文章:
- 如何理解将半精度指针转换为无符号长指针和相关的内存对齐
- 如何创建一个QTableWidgetItem,用长文本右对齐,左边有省略号
- 我可以检测和更改 gcc/g++ 中结构的当前数据对齐设置吗?
- 64位机器上的C++内存对齐
- 为什么将值返回函数传递给重载=运算符对运算符函数有效,而对其他运算符无效
- 为什么我可以将变量存储在不是其最小对齐方式的倍数的地址?
- 使 std::vector 分配对齐内存的现代方法
- C++ cout 将双精度对齐到精度 2 并正确对齐
- 在 64 位边界上对齐C++结构数组?
- 使用 g++7 构建的代码在访问未对齐的内存时崩溃
- 错误:无法解析对重载函数的引用;你的意思是调用它吗?
- 在 capnp FlatArrayMessageReader 的对齐内存缓冲区中接收 zmq 消息
- 是否值得对齐变量?
- 初始化派生结构的基部分/意外打包派生结构字段以对齐基结构的间隙
- C++17 中函数参数的指针对齐方式
- 在C 中顺序对齐函数
- 函数指针的对齐要求
- 是否可以强制GCC为内存对齐的对象生成高效的构造函数
- 类与虚拟函数的成员对象对齐和动态分配的问题
- c++函数内存对齐