sizeof(struct)返回的是该结构体在内存中占用的字节数,包含编译器按对齐规则插入的填充字节;例如struct{char a;int b;}在64位平台为8字节而非5字节,因其需满足最大成员(int,4字节对齐)的整数倍且末尾填充使总大小为4的倍数。

sizeof(struct) 返回的是什么
它返回的是该结构体在内存中占用的字节数,但这个值不等于所有成员大小之和——编译器会按对齐规则插入填充字节。比如 struct { char a; int b; } 在大多数 64 位平台是 8 字节,而不是 1 + 4 = 5 字节。
结构体对齐如何影响 sizeof 结果
对齐由最宽成员决定,也受编译器默认对齐策略(如 #pragma pack)或属性(如 __attribute__((packed)))影响:
-
sizeof值 = 最后一个成员结束位置 + 尾部填充,使整个结构体长度是其最大对齐数的整数倍 - 改变成员声明顺序可能改变
sizeof,例如把char放最后可减少填充 -
#pragma pack(1)会禁用填充,但可能导致性能下降或硬件异常(尤其在 ARM 或某些嵌入式平台)
运行时能否获取结构体大小
不能。C++ 的 sizeof 是编译期常量表达式,类型一旦确定,大小就固定。没有运行时函数或反射机制能“查出”某个 struct 类型的大小——除非你手动定义宏或 constexpr 变量来暴露它。
常见误操作:sizeof(ptr) 返回指针大小(通常是 4 或 8),不是它指向的结构体大小;sizeof(*ptr) 才正确。
跨平台或序列化时要注意什么
不同编译器、不同架构、甚至同一编译器不同版本,对齐策略可能不同,导致 sizeof 不一致。这对二进制协议、文件存储、网络传输很危险:
- 别直接 memcpy 整个结构体到文件或 socket,除非明确控制了对齐(如用
__attribute__((packed))并确认两端一致) - 用
static_assert(sizeof(MyStruct) == 12, "MyStruct size changed")在编译期捕获意外变更 - 结构体含指针、虚函数或非 POD 成员时,
sizeof无意义——它们不能被简单地按字节复制
sizeof 测,再用 offsetof 查每个字段偏移,才能真正看清内存布局。对齐不是优化技巧,而是底层契约。C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











