sizeof的用法与字节对齐
一、sizeof是什么?
sizeof是一种预编译处理,不是函数,不是一元表达式。也即,作用阶段在编译期。
二、功能是什么?
sizeof返回变量或类型的字节数。
三、调用方式
sizeof(object):对对象使用
sizeof(typename):对类型使用
四、返回值情况归类
其实质是考察各个类型所占内存的相关知识
基本数据类型:
char(unsigned) 1
short(unsigned) 2
int(unsigned) long float 4
double 8
函数:
返回值的类型
指针:
32位系统 4
64位系统 8
数组:
数组的实际大小
五、重点:对齐问题下的sizeof
各类型对界与其字节数一致。也即起始地址需要被对界整除。
另外,对于复合数据类型,如union、struct、class,类型字节数是成员最大对界的整数倍。
sizeof(union)
基本大小由最大的元素决定,但最终大小为最大对界的整数倍
union u1 { double a; int b; }; // 8 union u2 { char a[13]; char b; }; // 13 union u3 { char a[13]; int b; }; // 16,int类型的对界为4
sizeof(class)
包含虚函数的类,保存了指向虚函数表的指针,而一个指针为4个字节。
sizeof(struct) 略微复杂
struct类型的对界为成员中的最大对界,也即struct类型的字节数是对界的整数倍,同时起始地址也是对界的整数倍。
struct nalign { //基本成员类型 char a; //起始地址:0 占空空间:1 int b; //起始地址:4 占用空间:4 short c; //起始地址:8 占用空间:2 //总空间为10 //struct为4对界 总空间补全到12 }; struct nalign1 { //struct类型作为成员的情形 // char a; //对界:1 起始地址:0 占用空间:1 nalign b; //对界:4 起始地址:4 占用空间 12 //总空间为16 //struct为对界4 总空间补全到16 }; int main(int argc, char **argv) { cout << sizeof(nalign) << endl; // 输出"12" cout << sizeof(nalign1) << endl; //输出"16" }
总结:
在复合类型中,成员变量的对界为成员起始地址的整数倍;复合类型的对界为成员变量的最大对界;复合类型的大小为其对界的整数倍。