sizeof 运算符
来自cppreference.com
查询对象或类型的大小。
在需要知道对象的实际大小时使用。
语法
sizeof( 类型 )
|
(1) | ||||||||
sizeof 表达式
|
(2) | ||||||||
2) 产生表达式 的类型的对象表示的字节数,假如该表达式被求值。
| 类型 | - | 类型标识(见类型的命名) |
| 表达式 | - | 运算符优先级不低于 sizeof 的表达式(例如 sizeof a + b 会解析成 (sizeof a) + b 而不是 sizeof (a + b))
|
sizeof 表达式的结果是一个 std::size_t 类型的常量表达式。
注解
取决于计算机架构,字节可能具有 8 或更多位,确切的位数记录于 CHAR_BIT。
下列 sizeof 表达式始终求值为 1:
sizeof(char)sizeof(signed char)sizeof(unsigned char)
|
(C++17 起) |
|
(C++20 起) |
不能对函数类型、不完整类型或位域左值(C++11 前)泛左值(C++11 起)使用 sizeof。
当应用于引用类型时,结果是被引用类型的大小。
当应用于类类型时,结果是该类的完整对象所占据的字节数,包括这种对象放入数组时所需的任何额外填充。潜在重叠的子对象所占据的字节数可以小于该对象的大小。
sizeof 的结果始终非零,即使应用于空类。
当应用于某个表达式时,sizeof 并不对表达式进行求值(即该表达式是不求值操作数)(C++11 起),并且即便表达式代表多态对象,它的结果也是该表达式的静态类型的大小。不进行左值向右值、数组向指针和函数向指针转换。不过,它在形式上对纯右值实参进行临时量实质化:实参不可析构时程序非良构。(C++17 起)
关键词
示例
本示例的输出对应于具有 64 位指针和 32 位 int 的系统(亦称为 LP64 或 LLP64)。
运行此代码
#include <cstdlib>
#include <iostream>
struct Empty { };
struct Base { int a; };
struct Derived : Base { int b; };
struct Bit { unsigned bit: 1; };
struct CharChar { char c; char c2; };
struct CharCharInt { char c; char c2; int i; };
struct IntCharChar { int i; char c; char c2; };
struct CharIntChar { char c; int i; char c2; };
struct CharShortChar { char c; short s; char c2; };
int main()
{
Empty e;
Derived d;
Base& b = d;
[[maybe_unused]] Bit bit;
int a[10];
auto f = [&]() { return sizeof(int[10]) == sizeof a ? throw 1 : e; };
// f(); // 返回类型是 Empty,但是必然会抛出 1
auto println = [](auto rem, std::size_t size) { std::cout << rem << size << '\n'; };
println( "1) 空类的大小: ", sizeof e );
println( "2) 指针的大小: ", sizeof &e );
println( "3) sizeof(Bit) -类: ", sizeof(Bit) );
println( "4) sizeof(int[10])-含有10个 int 的数组:", sizeof(int[10]) );
println( "5) sizeof a -含有10个 int 的数组:", sizeof a );
println( "6) 含有10个 int 的数组的长度: ", ((sizeof a) / (sizeof *a)) );
println( "7) 含有10个 int 的数组的长度 (2): ", ((sizeof a) / (sizeof a[0])) );
println( "8) Derived 的大小: ", sizeof d );
println( "9) 通过 Base 获取 Derived 的大小: ", sizeof b );
println( "A) sizeof(unsigned): ", sizeof(unsigned) );
println( "B) sizeof(int): ", sizeof(int) );
println( "C) sizeof(short): ", sizeof(short) );
println( "D) sizeof(char): ", sizeof(char) );
println( "E) sizeof(CharChar): ", sizeof(CharChar) );
println( "F) sizeof(CharCharInt): ", sizeof(CharCharInt) );
println( "G) sizeof(IntCharChar): ", sizeof(IntCharChar) );
println( "H) sizeof(CharIntChar): ", sizeof(CharIntChar) );
println( "I) sizeof(CharShortChar): ", sizeof(CharShortChar) );
println( "J) f() 的大小: ", sizeof f() );
println( "K) Base::a 的大小: ", sizeof Base::a );
// println( "函数的大小: ", sizeof(void()) ); // 错误
// println( "不完整类型的大小:", sizeof(int[]) ); // 错误
// println( "位域的大小: ", sizeof bit.bit ); // 错误
}
可能的输出:
1) 空类的大小: 1
2) 指针的大小: 8
3) sizeof(Bit) -类: 4
4) sizeof(int[10])-含有10个 int 的数组:40
5) sizeof a -含有10个 int 的数组:40
6) 含有10个 int 的数组的长度: 10
7) 含有10个 int 的数组的长度 (2): 10
8) Derived 的大小: 8
9) 通过 Base 获取 Derived 的大小: 4
A) sizeof(unsigned): 4
B) sizeof(int): 4
C) sizeof(short): 2
D) sizeof(char): 1
E) sizeof(CharChar): 2
F) sizeof(CharCharInt): 8
G) sizeof(IntCharChar): 8
H) sizeof(CharIntChar): 12
I) sizeof(CharShortChar): 6
J) f() 的大小: 1
K) Base::a 的大小: 4
缺陷报告
下列更改行为的缺陷报告追溯地应用于以前出版的 C++ 标准。
| 缺陷报告 | 应用于 | 出版时的行为 | 正确行为 |
|---|---|---|---|
| CWG 1553 | C++11 | 可以对位域亡值使用 sizeof
|
已禁止 |
参阅
alignof (C++11)
|
查询类型的对齐要求 (operator) |
sizeof... 运算符(C++11)
|
查询包中的元素数 |
| 提供查询所有基础数值类型的性质的接口。 (类模板) | |
sizeof 的 C 文档
| |