为何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字节,你看到的是变量实际大小加上填充的空白字节:
- long的实际大小:在x86_64平台的GCC中,
long类型的大小是8字节(你可以在C代码里用sizeof(long)验证,结果会是8)。 - 内存对齐要求:x86_64架构下,8字节大小的类型(比如
long),其起始地址必须是8的倍数(即8字节对齐),这样CPU访问内存时效率更高。 - 栈布局细节:
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
相关产品推荐
相关产品推荐

