sizeof 运算符

来自cppreference.com
< cpp‎ | language
 
 
 
表达式
概述
值类别(左值 lvalue、右值 rvalue、亡值 xvalue)
求值顺序(序列点)
常量表达式
潜在求值表达式
初等表达式
lambda 表达式(C++11)
字面量
整数字面量
浮点字面量
布尔字面量
字符字面量,包含转义序列
字符串字面量
空指针字面量(C++11)
用户定义字面量(C++11)
运算符
赋值运算符a=ba+=ba-=ba*=ba/=ba%=ba&=ba|=ba^=ba<<=ba>>=b
自增与自减++a--aa++a--
算术运算符+a-aa+ba-ba*ba/ba%b~aa&ba|ba^ba<<ba>>b
逻辑运算符a||ba&&b!a
比较运算符a==ba!=ba<ba>ba<=ba>=ba<=>b(C++20)
成员访问运算符a[b]*a&aa->ba.ba->*ba.*b
其他运算符a(...)a,ba?b:c
new 表达式
delete 表达式
throw 表达式
alignof
sizeof
sizeof...(C++11)
typeid
noexcept(C++11)
折叠表达式(C++17)
运算符的代用表示
优先级和结合性
运算符重载
默认比较(C++20)
类型转换
隐式转换
一般算术转换
const_cast
static_cast
reinterpret_cast
dynamic_cast
显式转换 (T)a, T(a)
用户定义转换
 

查询对象或类型的大小。

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

语法

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)
  • sizeof(std::byte)
(C++17 起)
  • sizeof(char8_t)
(C++20 起)

不能对函数类型、不完整类型或位域泛左值使用 sizeof

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

当应用于类类型时,结果是该类的完整对象所占据的字节数,包括这种对象放入数组时所需的任何额外填充。潜在重叠的子对象所占据的字节数可以小于该对象的大小。

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

当应用于某个表达式时,sizeof 并不对表达式进行求值(即该表达式是不求值操作数) (C++11 起),并且即便表达式代表多态对象,它的结果也是该表达式的静态类型的大小。不进行左值向右值、数组向指针和函数向指针转换。不过,它在形式上对纯右值实参进行临时量实质化:实参不可析构时程序非良构。 (C++17 起)

关键词

sizeof

示例

本示例的输出对应于具有 64 位指针和 32 位 int 的系统。

#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( "函数的大小:     ", 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

缺陷报告

下列更改行为的缺陷报告追溯地应用于以前出版的 C++ 标准。

缺陷报告 应用于 出版时的行为 正确行为
CWG 1122 C++98 sizeof 的结果类型(std::size_t)被循环定义 按与 C 中相同的方式定义
CWG 1553 C++11 可以对位域亡值使用 sizeof 已禁止

参阅

alignof 运算符(C++11) 查询类型的对齐要求
sizeof... operator(C++11) 查询形参包中的元素数
提供查询所有基础数值类型的性质的接口。
(类模板)