概述
1、空结构体的大小
struct student
{
}stu;
大虾的解释:
sizeof(stu)的值是多少呢?在Visual C++ 6.0 上测试一下。
很遗憾,不是0,而是1。为什么呢?你想想,如果我们把struct student 看成一个模子
的话,你能造出一个没有任何容积的模子吗?显然不行。编译器也是如此认为。编译器认
为任何一种数据类型都有其大小,用它来定义一个变量能够分配确定大小的空间。既然如
此,编译器就理所当然的认为任何一个结构体都是有大小的,哪怕这个结构体为空。那万
一结构体真的为空,它的大小为什么值比较合适呢?假设结构体内只有一个char 型的数据
成员,那其大小为1byte(这里先不考虑内存对齐的情况).也就是说非空结构体类型数据最
少需要占一个字节的空间,而空结构体类型数据总不能比最小的非空结构体类型数据所占
的空间大吧。这就麻烦了,空结构体的大小既不能为0,也不能大于1,怎么办?定义为0.5
个byte?但是内存地址的最小单位是1 个byte,0.5 个byte 怎么处理?解决这个问题的最好
办法就是折中,编译器理所当然的认为你构造一个结构体数据类型是用来打包一些数据成
员的,而最小的数据成员需要1 个byte,编译器为每个结构体类型数据至少预留1 个byte
的空间。所以,空结构体的大小就定位1 个byte。
下面 我想写写我对内存对齐的理解:
#pragma pack( n )是设置几个字节对齐 n可以试1,2,4,8
为什么 要内存对齐?
为了提高程序的性能,数据结构(尤其是栈)应该尽可能地在自然边界上对齐。
先 讲不对齐:
如 :
struct test
{
char c;
int b;
}
不对齐 不浪费空间但很费时间。
下面 看对齐的方式 内存对齐包括内对齐和外对齐
如 :
#pragma pack(2)
struct test
{
char a; //1个字节
char b; //1个字节
int c; //4个字节
double d;//8个字节
char e; //1个字节
}
对齐的原则是 :pack里面的值是n=2 取结构体中最大的字节m=8 m与n比较取小者为k=2 即为外对齐的字节数
下面 是内对齐
1、char a; //1个字节 与2比较取小者 为1
2、char b; //1个字节 与2比较取小者 为1
3、int c; //4个字节与2比较取小者 为2
4、double d;//8个字节 与2比较取小者 为2
5、char e; //1个字节 与2比较取小者 为1
看图 :
这个 是内存对齐的分析 可以在编译器上试试各种类型。就会真正了解内存是怎么对齐的。
最后
以上就是饱满板栗为你收集整理的struct 关键字的全部内容,希望文章能够帮你解决struct 关键字所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复