sizeof
sizeof的计算发生在编译时刻,所以它可以被当作常量表达式使用。
32位计算机中,一个指针变量的返回值必定是4(等于计算机内部地址总线的宽度。)。
结构体sizeof存在字节对齐。
C99标准规定,函数、不能确定类型的表达式以及位域成员不能被计算sizeof值。
但可以对函数调用求值,其结果是函数返回类型的大小,函数并不会被调用。
char foo1(){}
void foo2(){}
sizeof(foo1());//OK
sizeof(foo2());//error
位域成员
C/C++中以一定区域内的位(bit)为单位来表示的数据成为位域,位域必须指明具体的数目。
一个位域必须存储在同一个字节中,不能跨两个字节,故位域的长度不能大于一个字节的长度。
取地址操作符&不能应用在位域字段上。
位域的作用主要是节省内存资源,使数据结构更紧凑。
类的大小
- 为类的非静态成员数据的类型大小之和。
- 类的大小与它当中的构造函数,析构函数,以及其成员函数无关。
- 如有虚函数,有一个指向虚函数的指针,故多4字节(32位系统)。
空类的大小
sizeof的结果为1
C++的选择是,自动给空类插入一个char类型,类对象实例化后可通过地址区分。
空类的作用
使用函数重载的方法,在参数中加入一个空类域作为区分不同的函数的方法,编译
的时候直接选择,而不是在运行的时候选择,这是非常提高效率的。
空数组
sizeof的结果为0
空数组名是一个指针,(不占类的空间)指向一个位置:
对于结构体中,空数组名这个指针指向了前面一个成员结束的第一个空间。
对于非结构体,空数组名这个指针指向的内容,与前一个对象的指针的内容一样。
#include <iostream>
using namespace std;
int main()
{
int i, j, a[0], k, m;
cout << &i << endl << &j << endl << &a << endl << &k << endl << &m << endl;
return 0;
}
64位PC g++编译器输出如下:
0x28ff1c
0x28ff18
0x28ff18
0x28ff14
0x28ff10
Tips:使用VSDebug模式下,int分配12字节,用来存储调试信息。Release模式分配8字节。
类中空数组
sizeof的结果为0
可用于给一个结构体添加一个缓冲区。
空数组是不占内存的,它就像一个指针指向某个地方,但是又不占内存。但是的确
我们的类对象能够借助空数组区分开来。