命名空间
变体
操作

sizeof 运算符

来自 cppreference.com
< cpp‎ | 语言
 
 
C++ 语言
 
 

查询对象或类型的尺寸。

在必须知道对象实际尺寸时使用。

内容

[编辑] 语法

sizeof( 类型 ) (1)
sizeof 表达式 (2)

这两个版本都是类型为 std::size_t 的常量表达式。

类型 - 一个 类型标识符(参见 类型命名
表达式 - 一个其 运算符优先级 不低于 sizeof 的表达式(例如 sizeof a + b 被解析为 (sizeof a) + b 而不是 sizeof (a + b)

[编辑] 解释

1) 返回 类型对象表示 的大小(以字节为单位)。
2) 如果 表达式 被求值,则返回 表达式 的类型的对象表示的大小(以字节为单位)。

[编辑] 注释

根据计算机架构的不同,一个 字节 可能由 8 或更多 位组成,确切的位数记录在 CHAR_BIT 中。

以下 sizeof 表达式始终求值为 1

  • sizeof(char)
  • sizeof(signed char)
  • sizeof(unsigned char)
(自 C++17 起)
  • sizeof(char8_t)
(自 C++20 起)

sizeof 不能与函数类型、不完整类型或位域 左值(直到 C++11)泛左值(自 C++11 起) 一起使用。

当应用于引用类型时,结果是所引用类型的尺寸。

当应用于类类型时,结果是该类完整对象所占用的字节数,包括放置此类对象到数组中所需的任何额外填充。 可能重叠的子对象 所占用的字节数可能小于该对象的尺寸。

sizeof 的结果始终非零,即使应用于空类类型。

当应用于表达式时,sizeof 不会评估表达式(即表达式是一个未评估的操作数)(自 C++11 起),即使表达式指定了一个多态对象,结果也是表达式静态类型的尺寸。不会执行左值到右值、数组到指针或函数到指针的转换。 但是,对于右值参数,临时材料化(正式)是执行的:如果参数不可析构,则程序将是非法的。(自 C++17 起)

[编辑] 关键字

sizeof

[编辑] 示例

示例输出对应于一个具有 64 位指针和 32 位 int 的系统(也称为 LP64LLP64)。

#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