第2.7章: sizeof
什么是 sizeof?
C++ 中的 sizeof 运算符返回某个类型或对象的大小(以字节计)。
它的结果类型始终是 ::std::size_t,这是一个无符号整数类型,保证能容纳任何对象大小。
对基础类型而言,sizeof 在编译期求值,是一个常量表达式。
基础示例
#include <fast_io.h>
#include <cstddef>
#include <cstdint>
#include <cstdfloat>
int main()
{
using namespace ::fast_io::iomnp;
::std::size_t sz1 = sizeof(::std::size_t);
::std::size_t sz2 = sizeof(::std::int32_t);
::std::size_t sz3 = sizeof(double);
::std::size_t sz4 = sizeof(::std::float64_t);
::std::size_t sz5 = sizeof(::std::float32_t);
::std::size_t sz6 = sizeof(::std::bfloat_t);
println("sizeof(::std::size_t) = ", sz1); // equals architecture byte size (8 on 64-bit, 4 on 32-bit)
println("sizeof(::std::int32_t) = ", sz2); // formula: 32/8 = 4
println("sizeof(double) = ", sz3); // typically 8
println("sizeof(::std::float64_t) = ", sz4); // 64/8 = 8
println("sizeof(::std::float32_t) = ", sz5); // 32/8 = 4
println("sizeof(::std::bfloat_t) = ", sz6); // 16/8 = 2
}
要点:sizeof 的结果始终是 ::std::size_t 值。
在典型的 64 位系统上:
sizeof(::std::size_t)= 8 字节(架构字长)sizeof(::std::int32_t)= 32/8 = 4 字节sizeof(double)= 8 字节sizeof(::std::float64_t)= 64/8 = 8 字节sizeof(::std::float32_t)= 32/8 = 4 字节sizeof(::std::bfloat_t)= 16/8 = 2 字节
公式
对固定宽度的整数与浮点类型,大小遵循一个简单的公式:
sizeof(::std::intXX_t)= XX / 8sizeof(::std::float32_t)= 32 / 8 = 4sizeof(::std::float64_t)= 64 / 8 = 8sizeof(::std::bfloat_t)= 16 / 8 = 2
对 ::std::size_t 而言,大小等于架构的字节宽度:
32 位系统上是 4 字节,64 位系统上是 8 字节。
运算符特性
- 对基础类型,
sizeof在编译期求值。 - 它不会求值其操作数——没有运行时副作用。
- 结果类型始终是
::std::size_t。 - 作用于类型时必须加圆括号,作用于对象时圆括号可选。
延伸阅读
完整细节见 cppreference:sizeof 以及 cppreference:固定宽度浮点类型 。