c++ summary对齐 栈对齐字节 mpreferred-stack-boundary
2023-12-27 17:16:16
栈对齐字节
????????在线或者使用GDB的disassemble查看汇编代码中临时变量分配的空间,发现临时空间大小为16的倍数。这是由 GCC的栈对齐值, -mpreferred-stack-boundary 决定的。
// http://gcc.gnu.org/onlinedocs/gcc-4.7.3/gcc/i386-and-x86_002d64-Options.html#i386-and-x86_002d64-Options
-mpreferred-stack-boundary=num
Attempt to keep the stack boundary aligned to a 2 raised to byte boundary. If is not specified, the default is 4 (16 bytes or 128 bits). num-mpreferred-stack-boundary
希望栈按照2的n次的字节边界对齐,n的取值范围是2-12。默认情况下,n=4
code
-
ESP:栈指针寄存器(extended stack pointer),其内存放着一个指针,该指针永远指向系统栈最上面一个栈帧的栈顶。(64位机器变为RSP),以下代码中,其偏移量均为16的倍数。
-
EBP:基址指针寄存器(extended base pointer),其内存放着一个指针,该指针永远指向系统栈最上面一个栈帧的底部。(64位机器变为RBP)
修改栈对齐字节
Union的对齐
#include <stdio.h>
#include <iostream>
void printBinary(int num) {
const int size = sizeof(int) * 8; // 获取int类型的位数
for (int i = size - 1; i >= 0; --i) {
int mask = 1 << i; // 创建位掩码,用于逐位检查
int bit = (num & mask) ? 1 : 0; // 获取第i位的值
std::cout << bit;
}
std::cout << std::endl;
}
union un{
int i;
char c[2];
};
int main() {
union un x;
x.c[0]= 10;
x.c[1]= 1;
printf("%d\n",x.i);// 266
printBinary(x.i);// 00000000000000000000000100001010
return 0;
}
CG
- x86汇编orb指令_linux 栈回溯(x86_64 )
- cfi_def_cfa_offset 规范框架偏移量
文章来源:https://blog.csdn.net/ResumeProject/article/details/133431339
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!