C++函数内存对齐
C++ function memory alignment
我以前读过类似的东西,但不幸的是,忘记了一些细节。
请解释函数内存对齐:
int f(int a = 3, int b = 5) {
int c = 7;
int *p = &c;
std::cout << "Pointer value: " << *p << "\tPointer address: " << p << std::endl;
--p;
std::cout << "Pointer value: " << *p << "\tPointer address: " << p << std::endl;
--p;
std::cout << "Pointer value: " << *p << "\tPointer address: " << p << std::endl;
--p;
std::cout << "Pointer value: " << *p << "\tPointer address: " << p << std::endl;
--p;
std::cout << "Pointer value: " << *p << "\tPointer address: " << p << std::endl;
--p;
std::cout << "Pointer value: " << *p << "\tPointer address: " << p << std::endl;
std::cout << "A address: " << &a << std::endl;
std::cout << "B address: " << &b << std::endl;
return c;
}
产生输出:
Pointer value: 7 Pointer address: 0x7ffd62ee8dcc
Pointer value: 6299840 Pointer address: 0x7ffd62ee8dc8
Pointer value: 32748 Pointer address: 0x7ffd62ee8dc4
Pointer value: -2112316480 Pointer address: 0x7ffd62ee8dc0
Pointer value: 3 Pointer address: 0x7ffd62ee8dbc
Pointer value: 5 Pointer address: 0x7ffd62ee8db8
Actual A address: 0x7ffd62ee8dbc
Actual B address: 0x7ffd62ee8db8
什么位于函数参数和堆栈中的第一个对象之间?
可能是返回给调用者的return地址
好奇心极强。您将了解调用函数时实际发生的情况,这是非常宝贵的信息。
堆栈不仅仅用于存储局部变量和函数参数。堆栈内容的确切布局由 ABI 决定,ABI 是对如何调用函数的特定于体系结构的描述。因此,在不知道这段代码是为什么架构编写的情况下,我无法提供具体细节。但一般来说,这些可能是调用函数时 CPU 的某些寄存器的值。该函数需要使用其中一些寄存器来完成其工作,因此它将它们的值保存在堆栈中,稍后它将 return 将这些值 return 到它们在寄存器中的原始位置,然后再 return 调用函数(调用函数还将地址 return 压入堆栈)。
下一步是向您的编译器传递正确的标志,使其在生成程序集之后但在汇编生成的目标文件和可执行文件之前停止。
我以前读过类似的东西,但不幸的是,忘记了一些细节。
请解释函数内存对齐:
int f(int a = 3, int b = 5) {
int c = 7;
int *p = &c;
std::cout << "Pointer value: " << *p << "\tPointer address: " << p << std::endl;
--p;
std::cout << "Pointer value: " << *p << "\tPointer address: " << p << std::endl;
--p;
std::cout << "Pointer value: " << *p << "\tPointer address: " << p << std::endl;
--p;
std::cout << "Pointer value: " << *p << "\tPointer address: " << p << std::endl;
--p;
std::cout << "Pointer value: " << *p << "\tPointer address: " << p << std::endl;
--p;
std::cout << "Pointer value: " << *p << "\tPointer address: " << p << std::endl;
std::cout << "A address: " << &a << std::endl;
std::cout << "B address: " << &b << std::endl;
return c;
}
产生输出:
Pointer value: 7 Pointer address: 0x7ffd62ee8dcc
Pointer value: 6299840 Pointer address: 0x7ffd62ee8dc8
Pointer value: 32748 Pointer address: 0x7ffd62ee8dc4
Pointer value: -2112316480 Pointer address: 0x7ffd62ee8dc0
Pointer value: 3 Pointer address: 0x7ffd62ee8dbc
Pointer value: 5 Pointer address: 0x7ffd62ee8db8
Actual A address: 0x7ffd62ee8dbc
Actual B address: 0x7ffd62ee8db8
什么位于函数参数和堆栈中的第一个对象之间?
可能是返回给调用者的return地址
好奇心极强。您将了解调用函数时实际发生的情况,这是非常宝贵的信息。
堆栈不仅仅用于存储局部变量和函数参数。堆栈内容的确切布局由 ABI 决定,ABI 是对如何调用函数的特定于体系结构的描述。因此,在不知道这段代码是为什么架构编写的情况下,我无法提供具体细节。但一般来说,这些可能是调用函数时 CPU 的某些寄存器的值。该函数需要使用其中一些寄存器来完成其工作,因此它将它们的值保存在堆栈中,稍后它将 return 将这些值 return 到它们在寄存器中的原始位置,然后再 return 调用函数(调用函数还将地址 return 压入堆栈)。
下一步是向您的编译器传递正确的标志,使其在生成程序集之后但在汇编生成的目标文件和可执行文件之前停止。