sizeof是编译时运算符,用于获取类型或对象的字节大小,不执行表达式且不影响运行性能;其值基于类型推导,在数组传递中会退化为指针导致大小丢失,结构体大小受内存对齐影响,需用sizeof(arr)/sizeof(arr[0])计算元素个数。

在C++中,sizeof 是一个编译时运算符,用于获取数据类型或对象在内存中所占的字节数。它并不在程序运行时计算大小,而是在编译阶段就确定结果,因此不会影响程序运行性能。
sizeof的基本用法
sizeof可以作用于以下几种形式:
- 基本数据类型:如 sizeof(int)、sizeof(char)
- 变量:如 int x; sizeof(x) • 数组:如 int arr[10]; sizeof(arr)
- 类或结构体:如 sizeof(MyClass)
- 指针:如 sizeof(ptr)
返回值类型为 size_t,这是一个无符号整数类型,定义在头文件如
sizeof的计算时机与原理
sizeof 在编译期完成计算,这意味着它不依赖于变量的实际值,也不执行任何表达式。例如:
立即学习“C++免费学习笔记(深入)”;
int a = 5; sizeof(a = a + 1); // 表达式 a = a + 1 不会被执行
上面代码中,赋值操作不会发生,因为 sizeof 只关心表达式的类型,而不求值(除了变长数组在C中的特殊情况,C++不支持变长数组)。
其工作原理基于类型推导:编译器根据操作数的类型决定其所占内存大小。比如:
- sizeof(char) 恒为 1
- sizeof(int) 通常是 4(取决于平台)
- sizeof(double) 通常是 8
数组与指针中的sizeof差异
这是最容易出错的地方。当数组作为函数参数传递时,会退化为指针,导致 sizeof 失去数组长度信息。
void func(int arr[]) {
cout << sizeof(arr) << endl; // 输出的是指针大小(如 8 字节)
}
int main() {
int data[10];
cout << sizeof(data) << endl; // 输出 40(假设 int 为 4 字节)
func(data);
}
在 main 中,data 是数组,sizeof 返回总字节数;而在 func 中,arr 被当作指针处理,所以只返回指针大小。
要正确获取数组元素个数,可以在编译期使用:
int arr[10]; size_t count = sizeof(arr) / sizeof(arr[0]); // 40 / 4 = 10
结构体和类的sizeof
结构体的大小不仅取决于成员变量的大小之和,还受到内存对齐的影响。
struct Example {
char c; // 1 字节
int i; // 4 字节
};
这个结构体大小通常不是 5,而是 8。因为编译器为了内存访问效率,在 char 后面填充了 3 个字节,使 int 成员按 4 字节对齐。
你可以通过 #pragma pack 或 alignas 控制对齐方式,但需谨慎使用,可能影响性能或跨平台兼容性。
基本上就这些。sizeof 看似简单,但在数组、指针和结构体内存布局中容易产生误解。理解其编译期行为和对齐机制,是写出可靠C++代码的基础。











