64位GCC编译器下结构体Goku大小不符合预期,求问题排查
64位GCC下结构体大小不符合预期的问题解析
问题场景
我的GCC编译器是64位,但结构体填充行为却类似32位。以下是我的代码:
#include <stdio.h> #include <stdint.h> #if UINTPTR_MAX == 0xffffffff #define SIZE 32 #elif UINTPTR_MAX == 0xffffffffffffffff #define SIZE 64 #else #define SIZE 69 #endif struct Goku{ int x,y; char b,c; }; int main(){ printf("Word size : %d bytes\n",SIZE/8); printf("Struct size : %lu bytes\n",sizeof(struct Goku)); printf("Integer size : %lu bytes\n",sizeof(int)); printf("Char size : %lu bytes\n",sizeof(char)); return 0; }
实际输出
Word size : 8 bytes Struct size : 12 bytes Integer size : 4 bytes Char size : 1 bytes
预期输出
Word size : 8 bytes Struct size : 16 bytes Integer size : 4 bytes Char size : 1 bytes
我预期结构体Goku的大小为16字节,但实际结果是12字节,请问哪里出错了?
问题解析
你对64位编译器下的结构体对齐规则存在误解:
64位系统/编译器的位宽,指的是处理器通用寄存器宽度和指针类型的大小(8字节),但结构体的填充对齐规则是由成员中最大的基本数据类型的对齐值决定的,而非直接绑定系统位宽。
你的结构体struct Goku里,最大的基本类型是int(4字节),所以整个结构体的对齐边界是4字节:
int x:占用0-3字节int y:占用4-7字节char b:占用8字节char c:占用9字节- 为了让结构体总大小是对齐边界(4字节)的整数倍,编译器自动填充2字节,最终总大小为12字节,这完全符合C标准的对齐规则。
你预期的16字节只有在结构体包含8字节对齐的类型时才会出现(比如long long、double或者64位指针)。如果强制让结构体按8字节对齐,可以使用GCC的扩展属性:
struct Goku{ int x,y; char b,c; } __attribute__((aligned(8)));
此时结构体大小会变为16字节,但这属于手动修改对齐规则,并非编译器的默认行为。
内容的提问来源于stack exchange,提问作者Saptarshi Dey
相关产品推荐
相关产品推荐

