
(从
开始
)
三个准则:
[1]一个结构变量的首个地址可以被其最宽的原始类型成员的大小整除.
[2]该结构的每个成员与该结构的第一个地址的偏移量是该成员大小的整数倍
[3]结构的总大小是该结构中最宽的基本类型成员的大小的整数倍
当结构中只有基本类型时,以上是默认对齐方式.
当有嵌套的复合成员时:

[2]更改为: 复合成员相对于结构的第一个地址的偏移量是复合成员最宽基本类型大小的整数倍
示例1:
struct tagPhone
{
字符A;
int B;
短C;
}电话;
示例2:

struct tagPhone
{
字符A;
短C;
int B;
} Phone2;
示例三:
struct tagPhone3
{

字符A;
字符B [2];
字符C [4];
} Phone3;
我们都知道char类型占1个字节,int类型占4个字节,short类型占2个字节,long类型占8个,double类型占16个. 那么我们可能会直接通过1 + 4 + 2 = 7来犯一个错误,该结构占用7个字节. 这是错误的.
以下是简要分析:
在计算结构的大小时,需要考虑其内存布局. 该结构以内存为单位存储. 每个单元的大小取决于结构中最大的基本类型的大小.
例如一个:

int类型占据4的倍数. 由于A占用一个字节,B无法容纳,因此打开一个新的单元,然后再打开一个新单元以放置C,因此格式1占用的字节数为: 3 * 4 = 12;
类似地,例如两个
A之后有三个字节,足以存储C,因此C存储在A之后sizeof计算结构体大小,然后创建一个新的单元来存储B数据. 因此sizeof计算结构体大小,格式2占用的内存字节为2 * 4 = 8.
例如三个:
计算出上述结构的大小,sizeof(Phone3)= 1 + 2 + 4 = 7,它的大小是该结构中字段大小的总和.
摘要:
第一种书写方式是严重浪费空间. 计算出的sizeof大小与期望值不一致,但是每个字段的数据类型都得到维护. 这也是最常见的粗心书写方式,普通人很容易这样写;
第三种写方法,也是最节省空间的写方法,也是使用sizeof查找与预期大小相同的大小,但是全部使用字节类型,则字段本机数据类型丢失了,而且不方便使用;
介于第一和第三种写入之间的第二种写入在空间上更紧凑,同时保留了结构中字段的数据类型.
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-157719-1.html
美国是全世界的政府
理智理智
美国