Sizeof
sizeof是编程语言C语言和C++中的操作符。它能表示資料類型或對象的存储大小(內存字節數)[1],存储大小以一個char大小的单位來衡量。因此sizeof (char)等於1 。被計算的数据类型不仅可以是原始型別,例如整数和浮点类型,还可以是指针类型和复合数据类型(联合体、结构体和 C++类)。
语法
sizeof
返回的是size_t
数据类型。对于变量作为运算数,可以不加括号;对于数据类型作为运算数,必须加括号。例如:
char c; printf ("%zu,%zu\n", sizeof c, sizeof (int));
C++11使用该运算符返回可变参数模板的参数个数:
template <typename... Args> std::size_t GetSize (Args&&... args) { /* Get size of parameter pack.*/ std::size_t Count= sizeof... (args); return Count; }
C99支持结构的“可灵活数组”(flexible array)成员:返回結構中包含padding,但不包括“可灵活数组”的佔用空間,此時的功能如同 offsetof(flexarray, array)
。
#include <stdio.h> struct flexarray { char val; int array[]; /* Flexible array member; must be last element of struct */ }; int main(int argc, char **argv) { printf("sizeof (struct flexarray) == %zu\n", sizeof (struct flexarray)); //通常结果为:sizeof (struct flexarray) == 4 return 0; }
C99还支持动态长度数组,其长度在运行时确定:
#include <stddef.h> size_t flexsize(int n) { char b[n + 3]; /* Variable length array */ return sizeof b; /* Execution time sizeof */ } int main(void) { size_t size = flexsize(10); /* flexsize returns 13 */ return 0; }
C++11支持获取类的成员的尺寸,不必实例化出对象:
#include <iostream> struct foo { int a; int b; }; int main () { std::cout << sizeof foo::a << "\n" << sizeof (foo) << "\n"; }
参考文献
- ^ 《C++进阶心法》吕吕,王琥编著 北京:北京航空航天大学出版社 2019 第39页.