前言
对C语言结构体进行字节对齐的合理排列并不仅仅可以节省非常大的空间,最重要的是体现个人编程的良好习惯。
以N对齐方式
所谓的以N对齐方式纯属我瞎掰的,哈哈。
所有的结构体成员在定义结构体分配内存时都要与所有成员中占内存最多的数据类型所占内存空间的字节数对齐。
**假如这个字节数为 N,**那么对齐的原则是:理论上所有成员在分配内存时都是紧接在前一个变量后面依次填充的,但是如果是“以 N 对齐”为原则,那么,如果一行中剩下的空间不足以填充某成员变量,即剩下的空间小于某成员变量的数据类型所占的字节数,则该成员变量在分配内存时另起一行分配。
假设一个结构体按照如下方式进行排列:
typedef struct TAutoTestParseTag TAutoTestParse;
struct TAutoTestParseTag
{
int a;
short b;
char c;
};
此时在结构体成员中,占内存最多的是成员a,所以该结构体是以4字节进行对齐的。
因为成员a、b、c理论上是紧邻相接的,且成员a占四个字节最大,后面分配的b占两个字节,紧跟着的c占一个字节,所以这里实际有效的字节数是4+2+1等于7个字节。
但由于对齐,所以最后总字节数是8,由于b和c一共占3个字节,但是此时结构体是按照4字节对齐的,所以字成员c的后面填充了一个空的字节。
如果更换下排列方式:
typedef struct TAutoTestParseTag TAutoTestParse;
struct TAutoTestParseTag
{
short b;
int a;
char c;
};
此时有效字节数为1+4+2等于7.
由于字节对齐,在b的后面还空有两个字节,但是不足以存放成员a,所以填充两个空字节,在存放成员a。
在c后面会进行填充3个空字节,所以最后的结构体所占字节数为2+2+4+1+3等于12.
可以发现不同的排列对最后结构体的所占空间影响还是蛮大的。
可能现在的一些机器已经有很大的空间来让我们用来浪费了,但是从程序员的自我修养角度来说还是尽量节省空间吧。但是!!!永远不要因为要节省空间,来让结构体内部成员的排列看起来影响代码的阅读性!!!,否则维护时可能会付出很大的代价。