结构体与字节对齐

对于大多数像我这样的c语言初学者来说,结构体无疑是一个让人头疼的地方,

今天我就自己的理解,写一篇有关结构体基础知识的文章。

在我们想要写一个结构体时,大多数同学可能都会说“定义”结构体,其实这样的

说法不甚准确,应该说成是“设计”结构体。因为在我们设计结构体的时候,系统并不

会为我们所设计的这个结构体开辟空间,而是当我们在定义一个结构体对象时,

才会在栈区开辟一段空间给我们的结构体对象,这时如果我们不初始化的话,系统

会默认为其每个成员赋值为0。

struct StrNode
{
        int  ref;
        int size;
        char type[20];
        char data[ ];
};

StrNode *sp;

SteNode s;

在上面这段代码中,我们设计了一个结构体,并且为其定义了两个对象,一个是

结构体对象 s,一个是结构体指针对象 *sp,用 s 调用结构体成员对其进行操作时

我们使用“  .  ”成员运算符,俗称打点调用,(s.ref,),用*sp调用对象成员时,

我们会用到指向符“->”(sp->ref)。

结构体的存储空间开辟方式:字节对齐

这里牵扯到一个cpu运行效率的问题,cpu在读取内存中的数据时,如果该数据的地址

不是它类型(长度)的整数倍,那么系统访问内存的次数就会增加,比如说  

一个整型变量的地址为0x00000002,则CPU如果取它的值的话需要访问两次内存,

第一次取从0x00000002-0x00000003的一个short,因为该地址只能被二整除,

第二次取从0x00000004-0x00000005的一个short然后组合得到所要的数据,

如果变量在0x00000003地址上的话则要访问三次内存,第一次为char,第二次为short,第三次为char,

然后组合得到整型数据 ,如果把该整型变量存放在0x00000004地址,则只需要访问

一次内存就可以读出这个整型数据。。。如果不进行字节对齐,每个数据不论它的类型

是什么,都把它依次存放,会节省空间,但是cpu运行效率会大大降低

下面给出字节对齐的一般的规则:

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

2) 结构体每个成员相对于结构体首地址的偏移量都是成员大小的整数倍,如有需要编译器

会在成员之间加上填充字节;例如上面第二个结构体变量的地址空间。

3) 结构体的总大小为结构体最宽基本类型成员大小的整数倍,如有需要编译器会在最末一

个成员之后加上填充字节。



猜你喜欢

转载自blog.csdn.net/mr_h9527/article/details/80244098