天天看点

关于内存对齐

#include<stdio.h>

structs1

{

charch;

intb2;

}s2;

structs3

charc1;

structs1s;

charc2;

}s4;

intmain()

inta;

intxh[4];

printf("%d\n",sizeof(a));

printf("%d\n",sizeofa);

printf("%d\n",sizeof(int));

printf("%d\n",sizeofxh);

printf("%d\n",sizeofs2);

printf("%d\n",sizeofs4);

return0;

}

输出:44416816

第一sizeof不是函数,

1、c语言中没有可接受参数为类型的函数,

2、没有哪一个函数可以没有括号的接收参数

而书中的归纳有:

1、sizeof是运算符,可用于任何变量名、类型名或常量值,当用于变量名(不是数组名)或常量时,它不需要用圆括号。

2、它在编译时起作用,而不是运行时。

3、注意结构体中的字节填充,字节的填充规则有:

1)结构体变量的首地址能够被其最宽基本类型成员的大小所整除;

2)结构体每个成员相对于结构体首地址的偏移量(offset)都是成员大小的整数倍,如有需要编译器会在成员之间加上填充字节(internaladding);

3)结构体的总大小为结构体最宽基本类型成员大小的整数倍,如有需要编译器会在最末一个成员之后加上填充字节(trailingpadding)。

#pragmapack的基本用法为:#pragmapack(n),

n为字节对齐数,其取值为1、2、4、8、16,默认是8,如果这个值比结构体成员的sizeof值小,那么如果设为1的话,应该是完全符合了

该成员的偏移量应该以此值为准,即是说,结构体成员的偏移量应该取二者的最小值,假定设置1字节对齐,那么完全符合计算结果

例如:

#pragmapack(1)

charch;

charc1;

structs1s;

4441657

5还有一点要注意,“空结构体”(不含数据成员)的大小不为0,而是1。试想一个“不占空间”的变量如何被取地址、两个不同的“空结构体”变量又如何得以区分呢于是,“空结构体”变量也得被存储,这样编译器也就只能为其分配一个字节的空间用于占位了。//有的编译器不通过,不允许定义空结构体,codeblock实现的是0,是一个灰色地带,

6strlen:求有效长度,sizeof总体长度,

鉴于char*p="fddfgfdgfg";sizeof(p)=4;而指针指向的长度,可以用strlen()+1来获取长度,

char数组的有效长度,用strlen,大小用sizeof();

7sizeof接受参数的时候运行,参数不会计算,

i=0;

printf("%d\n",sizeof(i+++(++i)));

printf("%d\n",i);

输出0

输出的大小是从里面的参数类型最大的一个,返回大小

继续阅读