sizeof 运算符
来自cppreference.com
查询对象或类型的大小。
在需要知道对象的实际大小时使用。
语法
sizeof( 类型 )
|
(1) | ||||||||
sizeof 表达式
|
(2) | ||||||||
两个版本都是 std::size_t 类型的常量表达式。
解释
2) 产生表达式 的类型的对象表示的字节数,假如该表达式被求值。
注解
取决于计算机架构,字节可能具有8或更多位,精确的位数记录于 CHAR_BIT。
下列 sizeof
表达式总是求值为 1:
- sizeof(char)
- sizeof(signed char)
- sizeof(unsigned char)
|
(C++17 起) |
|
(C++20 起) |
不能对函数类型、不完整类型或位域泛左值使用 sizeof
。
当应用于引用类型时,结果是被引用类型的大小。
当应用于类类型时,结果是该类的完整对象所占据的字节数,包括这种对象放入数组时所需的任何额外填充。潜在重叠的子对象所占据的字节数可以小于该对象的大小。
sizeof
的结果始终非零,即使应用于空类。
当应用于某个表达式时,sizeof
并不对表达式进行求值,并且即便表达式代表多态对象,其结果也是该表达式的静态类型的大小。不进行左值向右值、数组向指针和函数向指针转换。不过,它在形式上对纯右值实参进行临时量实质化:若实参不可析构则程序非良构。 (C++17 起)
关键词
示例
本示例的输出对应于具有 64 位指针和 32 位 int 的系统。
运行此代码
#include <iostream> struct Empty {}; struct Base { int a; }; struct Derived : Base { int b; }; struct Bit { unsigned bit: 1; }; int main() { Empty e; Derived d; Base& b = d; [[maybe_unused]] Bit bit; int a[10]; std::cout << "空类的大小: " << sizeof e << "\n" << "指针的大小: " << sizeof &e << "\n" // << "函数的大小: " << sizeof(void()) << "\n" // 错误 // << "不完整类型的大小: " << sizeof(int[]) << "\n" // 错误 // << "位域的大小: " << sizeof bit.bit << "\n" // 错误 << "Bit 类的大小: " << sizeof(Bit) << '\n' << "含有10个 int 的数组的大小: " << sizeof(int[10]) << "\n" << "含有10个 int 的数组的大小 (2):" << sizeof a << "\n" << "含有10个 int 的数组的长度: " << ((sizeof a) / (sizeof *a)) << "\n" << "含有10个 int 的数组的长度 (2):" << ((sizeof a) / (sizeof a[0])) << "\n" << "Derived 的大小: " << sizeof d << "\n" << "通过 Base 获取 Derived 的大小:" << sizeof b << "\n"; }
可能的输出:
空类的大小: 1 指针的大小: 8 Bit 类的大小: 4 含有10个 int 的数组的大小: 40 含有10个 int 的数组的大小 (2):40 含有10个 int 的数组的长度: 10 含有10个 int 的数组的长度 (2):10 Derived 的大小: 8 通过 Base 获取 Derived 的大小:4
参阅
alignof 运算符(C++11)
|
查询类型的对齐要求 |
sizeof... operator(C++11)
|
查询形参包中的元素数 |