sizeof是C/C++语言中的一种基本运算,用来求一个数据类型或变量在内存中占据空间的大小。大家对它也非常熟悉。考察如下程序。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include<iostream>

using namespace std;

int main(){
cout << "sizeof(char) =" << sizeof(char) << endl;
cout << "sizeof(short) =" << sizeof(short) << endl;
cout << "sizeof(int) =" << sizeof(int) << endl;
cout << "sizeof(long) =" << sizeof(long) << endl;
cout << "sizeof(float) =" << sizeof(float) << endl;
cout << "sizeof(double) =" << sizeof(double) << endl;
int i = 9;
cout << "i=" << i << endl;
cout << "sizeof(i) = " << sizeof(i) << endl;
cout << "sizeof(i=5) = " << sizeof(i=5) << endl;
cout << "i=" << i << endl;
cout << (i=5) << endl;
}

  在32位Windows操作系统下运行此程序,得到的结果是:

1
2
3
4
5
6
7
8
9
10
sizeof(char) = 1
sizeof(short) = 2
sizeof(int) = 4
sizeof(long) = 4
sizeof(float) = 4
sizeof(double) = 8
i = 9
sizeof(i) = 4
sizeof(i=5) = 4
i = 9

  C++基本数据类型的变量占据内存字节数的多少跟运行平台有关。目前占主导地位的是32位平台,此例子程序演示了各种基本类型的变量所占空间的大小。
  sizeof运算符除了接受类型作为参数外,还接受变量或表达式作为参数。在上面的程序中,最容易使人迷惑的是最后一行输出。如果不明白编译器对sizeof运算符的处理方式,可能会认为输出结果是:i=5,然而实际上正确的输出结果却是:i=9。这引申出sizeof运算的一个最大特点:sizeof是一种在编译时进行得运算。而与运行时无关。换句话说,在可执行代码中不包含sizeof运算。既然sizeof运算与运行时无关,所以当sizeof的参数是变量或表达式时,sizeof运算真正关心的是变量或表达式的类型,而不是变量或表达式的值。因为变量i的类型是int, 所以sizeof(i)等价于sizeof(int);因为表达式i=5的类型是int,所以sizeof(i=5)也等价于sizeof(int)。也就是说,在可执行代码中,并不包含i=5这个表达式,它早在编译阶段就被处理了。这就是为什么在程序结束时,i的值是9而不是5。
  sizeof作用域基本数据类型,在特定的平台上,结果是确定的。如果用sizeof计算类对象或结构的大小,情况要复杂一些。考虑下面的程序。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#include<iostream>

using namespace std;

class Small{};
class LessFunc{
int num;
void func1(){};
};

class MoreFunc{
int num;
void func1(){};
int func2(){
return 1;
}
};

class NeedAlign{
char e;
double d;
int i;
};

class Virtual{
int num;
virtual void func(){
};
};

int main(){
cout << sizeof(Small) << endl;
cout << sizeof(LessFunc) << endl;
cout << sizeof(MoreFunc) << endl;
cout << sizeof(NeedAlign) << endl;
cout << sizeof(Virtual) << endl;
}