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

文章来源:https://blog.csdn.net/ResumeProject/article/details/133431339
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。