sizeof
作用:
- 查询对象或者类型的大小
- 在需要知道对象的实际大小时使用
语法:
sizeof( 类型 )
sizeof 表达式
注解:
- 结果取决于计算机架构
- 不能对函数类型、不完整类型或位域泛左值使用 sizeof。
- 当应用于引用类型时,其结果是被引用类型的大小。
- 当应用于类类型时,其结果是该类的对象的大小加上这种对象放入数组时所需的额外填充的大小的和
- sizeof 的结果始终非零,即使应用于空类。
- 当应用于某个表达式时,sizeof 并不对表达式进行求值,并且即便表达式代表多态对象,其结果也是该表达式的静态类型的大小。不进行左值向右值、数组向指针和函数向指针转换。不过,它在形式上对纯右值实参进行临时量实质化:sizeof 确定其结果对象的大小。 (C++17 起)
- 下列 sizeof 表达式总是求值为 1:
sizeof(char) sizeof(signed char) sizeof(unsigned char) sizeof(std::byte) //(C++17 起) sizeof(char8_t) // (C++20 起)
示例:
#include <iostream>
struct Empty {
};
struct Base {
int a; };
struct Derived : Base {
int b; };
struct Bit {
unsigned bit: 1; };
int main()
{
Empty e;
Base t;
Derived d;
Base& b = d;
[[maybe_unused]] Bit bit;
int a[10];
std::cout << "空类的大小: " << sizeof e << "\n" // 1
<< "指针的大小: " << sizeof &e << "\n" // 8
// ----- 不能对函数类型、不完整类型或位域泛左值使用 sizeof。 -------
// << "函数的大小: " << sizeof(void()) << "\n" // 错误
// << "不完整类型的大小: " << sizeof(int[]) << "\n" // 错误
// << "位域的大小: " << sizeof bit.bit << "\n" // 错误
<< "Bit 类的大小: " << sizeof(Bit) << '\n' // 4
<< "含有10个 int 的数组的大小: " << sizeof(int[10]) << "\n" // 4 * 10
<< "含有10个 int 的数组的大小 (2):" << sizeof a << "\n"
<< "含有10个 int 的数组的长度: " << ((sizeof a) / (sizeof *a)) << "\n"
<< "含有10个 int 的数组的长度 (2):" << ((sizeof a) / (sizeof a[0])) << "\n"
<< "Base 的大小: " << sizeof t << "\n" // 4 ---》int
<< "Derived 的大小: " << sizeof d << "\n"
<< "通过 Base 获取 Derived 的大小:" << sizeof b << "\n";
}