c++ summary对齐 栈对齐字节 mpreferred-stack-boundary

栈对齐字节

        在线或者使用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)

c++ summary对齐 栈对齐字节 mpreferred-stack-boundary_第1张图片
c++ summary对齐 栈对齐字节 mpreferred-stack-boundary_第2张图片

修改栈对齐字节

c++ summary对齐 栈对齐字节 mpreferred-stack-boundary_第3张图片

Union的对齐

#include 
#include 


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 规范框架偏移量

你可能感兴趣的:(语言学习笔记,c++,开发语言)