您的位置:首页 > 编程语言 > C语言/C++

C语言中的结构

2010-11-01 17:17 281 查看
1、C语言中的结构与数组的区别,首先它们的相同点是都是聚合数据类型都可以同时存储超过一个的单独数据,但是他们之间的区别却是非常重要的:

结构不可以像数组那样使用下标或指针来间接访问它的每一个元素;数组中的元素之所以可以使用下标来访问是因为它的每一个元素的长度都相同,但是结构的每一个成员的长度可能不相同,所以不能使用下标来访问他们,而是使用每个一个结果成员自己的名字来访问。

结构在表达式中使用时,它并不会被替换成指针,结构变量是一个标量,和其他的标量一样,在作为参数传递给其他函数时是复制这个结构的值,而不是一个指向它的指针,了解这一点很重要,因为如果一个结构很复杂(包含数组包含其他的结构)的话,那么在参数传递时,系统将会创建一个一模一样的结构用于存储传递来的结构参数,并对这个复杂的结构进行赋值(如果这个结果中包含数组,系统将创建一个同样长度的数组并将参数中的数组全部复制到新的数组中),可想而知这样将会消耗较大的系统资源,因此一种非常有效的方法就是声明一个指向该结构的指针,并将这个指针作为参数传递给函数。这也是C语言中指针高效运用的一个好例子吧。

2、结构的存储,关于边界对齐

看下面这个例子:

struct EX

{

char a;

int b;

char c;

}

如果在一个32位的机器上,整型值的长度为4个字节,且它的起始位置必须能够被4整除,如果a字节存储的地址为10004,那么整型b的存储地址就应该是10008,c字节的存储地址就应该是10012,姑且不说如果存储于其后面的是另一个整型元素(将要从地址10016开始),这个结构占据的内存字节数为(10013-10004)9个字节。实际使用sizeof测试占用字节12个字节(因为下一个元素的存储将于10016开始)。

看另外一个例子:

struct EX2

{

int b;

char a;

char c;

}

和上面的一样分析,整型b存储的地址为10004,那么a存储的地址为10008,c存储的地址为10009,而这个结构占据的内存字节数为(10010-10004)6个字节。实际使用sizeof测试占用8个字节(因为下一个元素的存储地址将从10012开始)

通过上面的两个例子我们可以看出,结构内的元素相同,只是声明的顺序不同,则结构占据的内存却完全不一样,虽然这两个结构只是相差3个字节,但是如果一个程序中需要使用大量的这样的结构,那么这个内存占用问题就不得不考虑了,而且这个节省内存的方法完全不会影响到程序的效率。这就是传说中的边界对齐要求。

还有一个疑问,为什么举的例子都是从10004开始而不是从10003开始呢(如果从10003开始暂用的字节数将会不同)?这是因为系统要求所有结构的起始存储位置必须是边界对齐的。

因此在声明结构时最好是将对边界要求最严格的元素类型放在最前面声明,这样可以最大限度的提高内存的使用率。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: