主要来自 http://www.cppblog.com/andxie99/archive/2006/10/26/14230.html
定义:
sizeof是C/C++中的一个操作符,作用是返回一个对象或者类型所占的内存字节数。
使用:
sizeof有三种语法形式,如下:
1) sizeof( object ); // sizeof( 对象 );
2) sizeof( type_name ); // sizeof( 类型 );
3) sizeof object; // sizeof 对象;
通常不用(3)。object可以是表达式,即sizeof可以对一个表达式求值,编译器会根据表达式的最终结果类型来确定大小,通常不会对表达式进行计算。如果对一个函数求值,则返回函数的返回值类型的大小。C99标准规定,函数、不能确定类型的表达式以及位域(bit-field)成员不能被计算sizeof值。
常量性:sizeof的计算发生在编译时刻,所以它可以被当作常量表达式使用。
sizeof的大小
1. 基本数据类型的sizeof是和系统相关的,所以在不同的系统下取值可能不同。
2. 指针变量的sizeof等于计算机内部地址总线的宽度。
3. 数组的sizeof值等于数组所占用的内存字节数。
4. 结构体的sizeof需要考虑字节对齐。
5. 含位域结构体的sizeof,C99中规定int、unsigned int和bool可以作为位域类型,但编译器几乎都对此作了扩展,允许其它类型类型的存在。使用位域的主要目的是充分利用存储空间,其大致规则为:
1) 如果相邻位域字段的类型相同,且其位宽之和小于该类型的sizeof大小,则后面的字段将紧邻前一个字段存储,直到不能容纳为止;
2) 如果相邻位域字段的类型相同,但其位宽之和大于该类型的sizeof大小,则后面的字段将从新的存储单元开始,其偏移量为其类型大小的整数倍;
示例1:
struct BF1
{
char f1 : 3;
char f2 : 4;
char f3 : 5;
};
其内存布局为:
|_f1__|__f2__|_|____f3___|____|
|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|
位域类型为char,第1个字节仅能容纳下f1和f2,所以f2被压缩到第1个字节中,而f3只能从下一个字节开始。因此sizeof(BF1)的结果为2。
3) 如果相邻的位域字段的类型不同,则各编译器的具体实现有差异,VC6采取不压缩方式,Dev-C++采取压缩方式;
示例2:
struct BF2
{
char f1 : 3;
short f2 : 4;
char f3 : 5;
};
由于相邻位域类型不同,在VC6中其sizeof为6,在Dev-C++中为2。
4) 如果位域字段之间穿插着非位域字段,则不进行压缩;
struct BF3
{
char f1 : 3;
char f2;
char f3 : 5;
};
非位域字段穿插在其中,不会产生压缩,在VC6和Dev-C++中得到的大小均为3。
5) 整个结构体的总大小为最宽基本类型成员大小的整数倍。
6. 联合体的sizeof,结构体在内存组织上是顺序式的,联合体则是重叠式,各成员共享一段内存,所以整个联合体的sizeof也就是每个成员sizeof的最大值。