You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何long类型在汇编代码中看似占用12字节内存?

为什么GCC生成的未优化汇编中long变量看似占用12字节?

我是汇编语言新手,正在查看GCC未优化代码生成的、用于初始化int、long和char变量的函数。

C代码

int main()
{
    int intVariable {};
    long longVariable {};
    char charVariable{};

    return 0;
}

对应的汇编代码

push    rbp
        mov     rbp, rsp
        mov     DWORD PTR [rbp-4], 0
        mov     QWORD PTR [rbp-16], 0
        mov     BYTE PTR [rbp-17], 0
        mov     eax, 0
        pop     rbp
        ret

我的观察:

  • 创建的int变量占用4字节([rbp-4]):区间0->4
  • 创建的long变量看似占用12字节([rbp-16]):区间4->16
  • 创建的char变量占用1字节([rbp-17]):区间16->17

想请教各位,为何long数据类型看似占用12字节?


解答

这是内存对齐规则导致的,long类型本身并没有占用12字节,你看到的是变量实际大小加上填充的空白字节:

  1. long的实际大小:在x86_64平台的GCC中,long类型的大小是8字节(你可以在C代码里用sizeof(long)验证,结果会是8)。
  2. 内存对齐要求:x86_64架构下,8字节大小的类型(比如long),其起始地址必须是8的倍数(即8字节对齐),这样CPU访问内存时效率更高。
  3. 栈布局细节:
    • rbp是栈帧的基址(高地址端),本身是8字节对齐的。
    • int变量(4字节)被放在rbp-4到rbp的位置,占4字节。
    • 要放置long变量时,为了满足8字节对齐要求,编译器在int和long之间插入了4字节的填充空白,把long放在了rbp-16到rbp-8的位置(8字节)。
    • char变量(1字节)只需要1字节对齐,所以直接放在long的下方(低地址方向),即rbp-17到rbp-16的位置。

简单来说,你看到的12字节是long的8字节加上它和int之间的4字节填充,这是编译器为了满足内存对齐规则自动添加的,并非long本身的大小。


内容的提问来源于stack exchange,提问作者rand_program

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 23:35:27