sizeof
运算符
来自 cppreference.com
查询对象或类型的尺寸。
在必须知道对象实际尺寸时使用。
内容 |
[编辑] 语法
sizeof( 类型 ) |
(1) | ||||||||
sizeof 表达式
|
(2) | ||||||||
这两个版本都是类型为 std::size_t 的常量表达式。
类型 | - | 一个 类型标识符(参见 类型命名) |
表达式 | - | 一个其 运算符优先级 不低于 sizeof 的表达式(例如 sizeof a + b 被解析为 (sizeof a) + b 而不是 sizeof (a + b)) |
[编辑] 解释
2) 如果 表达式 被求值,则返回 表达式 的类型的对象表示的大小(以字节为单位)。
[编辑] 注释
根据计算机架构的不同,一个 字节 可能由 8 或更多 位组成,确切的位数记录在 CHAR_BIT 中。
以下 sizeof
表达式始终求值为 1
- sizeof(char)
- sizeof(signed char)
- sizeof(unsigned char)
|
(自 C++17 起) |
|
(自 C++20 起) |
sizeof
不能与函数类型、不完整类型或位域 左值(直到 C++11)泛左值(自 C++11 起) 一起使用。
当应用于引用类型时,结果是所引用类型的尺寸。
当应用于类类型时,结果是该类完整对象所占用的字节数,包括放置此类对象到数组中所需的任何额外填充。 可能重叠的子对象 所占用的字节数可能小于该对象的尺寸。
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(); // the return type is Empty, but always throws 1 auto println = [](auto rem, std::size_t size) { std::cout << rem << size << '\n'; }; println( "1) sizeof empty class: ", sizeof e ); println( "2) sizeof pointer: ", sizeof &e ); println( "3) sizeof(Bit) class: ", sizeof(Bit) ); println( "4) sizeof(int[10]) array of 10 int: ", sizeof(int[10]) ); println( "5) sizeof a array of 10 int: ", sizeof a ); println( "6) length of array of 10 int: ", ((sizeof a) / (sizeof *a)) ); println( "7) length of array of 10 int (2): ", ((sizeof a) / (sizeof a[0])) ); println( "8) sizeof the Derived class: ", sizeof d ); println( "9) sizeof the Derived through Base: ", 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) sizeof f(): ", sizeof f() ); println( "K) sizeof Base::a: ", sizeof Base::a ); // println( "sizeof function: ", sizeof(void()) ); // error // println( "sizeof incomplete type: ", sizeof(int[]) ); // error // println( "sizeof bit-field: ", sizeof bit.bit ); // error }
可能的输出
1) sizeof empty class: 1 2) sizeof pointer: 8 3) sizeof(Bit) class: 4 4) sizeof(int[10]) array of 10 int: 40 5) sizeof a array of 10 int: 40 6) length of array of 10 int: 10 7) length of array of 10 int (2): 10 8) sizeof the Derived class: 8 9) sizeof the Derived through Base: 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) sizeof f(): 1 K) sizeof Base::a: 4
[编辑] 缺陷报告
以下行为更改缺陷报告被追溯应用于之前发布的 C++ 标准。
DR | 应用于 | 已发布的行为 | 正确行为 |
---|---|---|---|
CWG 1122 | C++98 | sizeof (std::size_t) 的结果类型是循环定义的 | 它与 C 中的定义相同 |
CWG 1553 | C++11 | sizeof 可以与位域 xvalue 一起使用 |
禁止 |
[编辑] 另请参阅
alignof 运算符(自 C++11 起) |
查询类型的对齐要求 |
sizeof... 运算符(自 C++11 起) |
查询 参数包 中的元素数量 |
提供了一个接口来查询所有基本数值类型的属性 (类模板) | |
C 文档 for sizeof
|