sizeof 返回一个对象或者类型名的长度,返回值的类型为size_t,其结果是编译时常量。
1 所有的指针大小同等于机器字长
2 int 在32位和64位上一般是4字节。long 同等于机器字长。
3 sizeof不对表达式进行运算,只取表达式结果的类型长度
int a[] = {1,2,3}; char *t = NULL; const char *p = "123"; int k1 = 0; int k2 = 1;
sizeof(a) = 12;
sizeof(*t) = 1;
sizeof(p) = 4;
sizeof( k2 = k1) = 4 此时k2的值依旧是1.
4 结构体含有多个对象时,需要字节对齐。每个编译器都有默认的对齐系数k,gcc默认为4,VC默认为8.每种数据类型都有自身的对齐大小s,即其自身的大小,最后整个结构体也要对齐。结构内的成员对齐是指数据成员的地址应当和min(k,s)对齐。整个结构体的大小应该和所有的结构体大小中最大的那个,与k两者最小的哪个对齐。
比如:
假设对齐系数k=4
struct T {
int a; // 长度为4,起始地址0%sizeof(int)= 0, [0,3]
char b; //长度为1,起始地址4 %(sizeof(char)) = 0, [4]
short c; //长度为2,, 起始地址5%sizeof(shor) !=0,对齐为 6, 存放地址为[6,7]
};
整体的长度此时为8, min(max(int,char,short), k) = 4,最终对齐为8.
再如:
对齐系数k=8时,
struct T2 {
char b; //长度为1,起始地址0 %(sizeof(char)) = 0, [0]
double a; // 长度为8,起始地址1%sizeof(double) != 0,对齐为8, [8,15]
short c; //长度为2,, 起始地址15%sizeof(shor) !=0,对齐为 16, 存放地址为[16,17]
};
此时结构体长度为18,不能对齐,min(max(int,char,short), k) = 8, 最终对齐为24.
上述结构体k=4时:
struct T2 {
char b; //长度为1,起始地址0 %(sizeof(char)) = 0, [0]
double a; // 长度为8,自身对齐系数为min(k,8) = 4, 起始地址1%4 != 0,对齐为4, [4,11]
short c; //长度为2,, 起始地址12%sizeof(shor) =0, 存放地址为[12,13]
};
此时结构体长度为14,不能对齐,min(max(int,char,short), k) = 8, 最终对齐为16.