sizeof 运算符

来自cppreference.com
< cpp‎ | language

查询对象或类型的大小。

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

语法

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

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

解释

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++17 起)

关键词

sizeof

示例

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

#include <iostream>
 
struct Empty {};
struct Base { int a; };
struct Derived : Base { int b; };
struct Bit { unsigned bit: 1; };
 
int main()
{
    Empty e;
    Derived d;
    Base& b = d;
    [[maybe_unused]] Bit bit;
    int a[10];
    std::cout << "空类的大小:                   " << sizeof e        << "\n"
              << "指针的大小:                   " << sizeof &e       << "\n"
//            << "函数的大小:                  "  << sizeof(void())  << "\n" // 错误
//            << "不完整类型的大小:             "  << sizeof(int[])   << "\n" // 错误
//            << "位域的大小:                  "  << sizeof bit.bit  << "\n" // 错误
              << "Bit 类的大小:                " << sizeof(Bit)     << '\n'
              << "含有10个 int 的数组的大小:    "  << sizeof(int[10]) << "\n"
              << "含有10个 int 的数组的大小 (2):"  << sizeof a        << "\n"
              << "含有10个 int 的数组的长度:    "  << ((sizeof a) / (sizeof *a)) << "\n"
              << "含有10个 int 的数组的长度 (2):"  << ((sizeof a) / (sizeof a[0])) << "\n"
              << "Derived 的大小:               " << sizeof d        << "\n"
              << "通过 Base 获取 Derived 的大小:" << sizeof b        << "\n";
 
}

可能的输出:

空类的大小:                   1
指针的大小:                   8
Bit 类的大小:                4
含有10个 int 的数组的大小:    40
含有10个 int 的数组的大小 (2):40
含有10个 int 的数组的长度:    10
含有10个 int 的数组的长度 (2):10
Derived 的大小:               8
通过 Base 获取 Derived 的大小:4

参阅

alignof 运算符(C++11) 查询类型的对齐要求
sizeof... operator(C++11) 查询形参包中的元素数