关于C内存组织方式____结构体对齐

来源:互联网 发布:混沌战域仙翼进阶数据 编辑:程序博客网 时间:2024/05/18 09:09

笔记:

对齐的作用和原因:一些平台对某些特定类型的数据只能从某些特定地址开始存取。其他平台可能没有这种情况,但是最常见的是如果不按照适合其平台要求对数据存放进行对

齐,会在存取效率上带来损失。比如有些平台每次读都是从偶地址开始,如果一个int型(假设为32位系统)如果存放在偶地址开始的地方,那么一个读周期就可以读出,而如果存

放在奇地址开始的地方,就可能会需要2个读周期,并对两次读出的结果的高低字节进行拼凑才能得到该int数据。

 

对齐算法:        

 

1.数据类型自身的对齐值:                              //基本数据类型的自身对齐值

 

2.指定对齐值:                                                //#pragma pack(value)

 

3.结构体或者类的自身对齐值:                      //成员中自身对齐值最大的值

 

4.数据成员、结构体和类的有效对齐值:       //min(自身对齐值, 指定对齐值)

 

A:      结构体成员变量对齐,有效对齐值N------决定数据存放地址方式的值。(存放其实地址%N == 0)

 

B:      结构体圆整(结构体成员变量占用的总长度是结构体有效对齐值的整数倍)

eg:

#pragma pack(4)

struct B

{

    char a;                        //char a[4];

    int b;

    short c;

}b;

#pragma pack()

假设从地址空间0X0000排放。指定对齐值=4

 

成员对齐:

a.自身对齐值=1; 有效对齐值=1;    a存放地址0x0000%1=0;                    a----0x0000

b.自身对齐值=4; 有效对齐值=4;     b存放地址0x0004%4=0;                   b----0x0004~0x0007

c.自身对齐值=2; 有效对齐值=2;     c存放地址0x0008%2 =0;                  c----0x0008~0x0009

 

结构体圆整:

结构体自身对齐值=MAX(a.自身对齐值, b.自身对齐值, c.自身对齐值) = 4;

结构体有效对齐值=MIN(自身对齐值,指定对齐值)=4;

a+b+c----0x0000~0x0009

长度=10

(10+2)%4=0;

------> 0x000A~0x000B也被结构体占用,sizeof(B)=12.

 typedef struct JC_STRUCT

{

    long id;

    char name[10];

    char sex[2];

    float mark[3];

}JC_STRUCT;

//sizeof(JC_STRUCT)=28.

 //枚举

typedef enum JC_PROBLEM_3//枚举
 {
  NO_PROBLEM = 0,
  PROBLEM_1,
  PROBLEM_2,
  PROBLEM_3

 }JC_PROBLEM_3;

------>常类型