C++ 编程
sizeof
关键字指的是一个在编译时工作的运算符,它报告传递给它的类型所占存储空间的大小(等效于该类型变量的大小)。该大小以字符大小的倍数返回,在许多个人电脑上为 1 字节(或 8 位)。字符中的位数存储在 <climits> 头文件中定义的 CHAR_BIT 常量中。这是运算符重载不允许的运算符之一。
//Examples of sizeof use
int int_size( sizeof( int ) );// Might give 1, 2, 4, 8 or other values.
// or
int answer( 42 );
int answer_size( sizeof( answer ) );// Same value as sizeof( int )
int answer_size( sizeof answer); // Equivalent syntax
例如,以下代码使用 sizeof
来显示多个变量的大小
struct EmployeeRecord {
int ID;
int age;
double salary;
EmployeeRecord* boss;
};
//...
cout << "sizeof(int): " << sizeof(int) << endl
<< "sizeof(float): " << sizeof(float) << endl
<< "sizeof(double): " << sizeof(double) << endl
<< "sizeof(char): " << sizeof(char) << endl
<< "sizeof(EmployeeRecord): " << sizeof(EmployeeRecord) << endl;
int i;
float f;
double d;
char c;
EmployeeRecord er;
cout << "sizeof(i): " << sizeof(i) << endl
<< "sizeof(f): " << sizeof(f) << endl
<< "sizeof(d): " << sizeof(d) << endl
<< "sizeof(c): " << sizeof(c) << endl
<< "sizeof(er): " << sizeof(er) << endl;
在大多数机器上(考虑字符的大小),上面的代码显示以下输出
sizeof(int): 4
sizeof(float): 4
sizeof(double): 8
sizeof(char): 1
sizeof(EmployeeRecord): 20
sizeof(i): 4
sizeof(f): 4
sizeof(d): 8
sizeof(c): 1
sizeof(er): 20
同样重要的是要注意,各种类型变量的大小会根据您所处的系统而变化。查看数据类型页面了解更多信息。
语法上,sizeof
在获取类型大小的时候看起来像一个函数调用,但在获取变量类型大小的时候可以使用括号(例如 sizeof(int)
)。如果参数是变量或数组,则可以省略括号(例如 sizeof x
,sizeof myArray
)。关于在后一种情况下是否应该使用省略括号的余地,风格指南有所不同。
考虑下面的例子
#include <cstdio>
short func( short x )
{
printf( "%d", x );
return x;
}
int main()
{
printf( "%d", sizeof( sizeof( func(256) ) ) );
}
由于 sizeof
在运行时不评估任何内容,因此 func()
函数永远不会被调用。所有需要的信息都是函数的返回类型,第一个 sizeof
将返回一个 short(函数的返回类型)的大小,值为 2(在 size_t 中,一个在包含文件 STDDEF.H 中定义的整数类型),第二个 sizeof
将返回 4(第一个 sizeof
返回的 size_t 的大小)。
sizeof
测量一个对象的大小,就简单的连续存储区域而言;对于包含指向其他存储区的指针的类型,间接存储区不包含在 sizeof
返回的值中。C++ 编程新手常犯的一个错误是试图使用 sizeof
来确定一个字符串的长度;std::strlen或者std::string::length函数更适合于此任务。
sizeof
在最近几年也得到了新的应用,在模板元编程中,它可以将类型转换为数字,尽管方式比较原始,但通常非常有用,因为模板元编程环境通常使用类型进行大部分计算。