命名空间
变体
操作

sizeof 运算符

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

查询对象或类型的大小。

在需要知道对象实际大小时使用。

目录

[编辑] 语法

sizeof( 类型 ) (1)
sizeof 表达式 (2)
1) 返回类型对象表示的字节大小。
2) 返回表达式类型的对象表示的字节大小,如果该表达式被求值。
类型 - 一个type-id(参见类型命名
表达式 - 一个表达式,其运算符优先级不低于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 起)
  • sizeof(char8_t)
(C++20 起)

sizeof不能用于函数类型、不完整类型或位域左值(C++11前)glvalue(C++11起)

当应用于引用类型时,结果是引用类型的大小。

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

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

当应用于表达式时,sizeof不评估表达式(即表达式是一个未评估的操作数)(C++11起),即使表达式指定一个多态对象,结果也是表达式的静态类型的大小。不执行左值到右值、数组到指针或函数到指针的转换。然而,对于prvalue参数会(形式上)执行临时物化:如果参数不可销毁,则程序格式错误。(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++ 标准。

缺陷报告 应用于 发布时的行为 正确的行为
CWG 1553 C++11 sizeof可用于位域xvalues 已禁止

[编辑] 另请参见

alignof (C++11) 查询类型的对齐要求
(运算符)[编辑]
sizeof... 运算符 (C++11) 查询中的元素数量[编辑]
提供查询所有基本数值类型属性的接口
(类模板) [编辑]
C 文档 了解 sizeof