关于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;
------>常类型
- 关于C内存组织方式____结构体对齐
- C语言 关于结构体的内存对齐
- 关于结构体,内存对齐,sizeof
- 关于结构体的内存对齐
- 关于结构体的内存对齐
- 关于结构体的内存对齐
- 关于结构体的内存对齐
- 关于结构体的对齐方式
- 关于结构体对齐方式的记录
- C里结构体的内存对齐
- C语言结构体对象内存对齐
- C语言结构体的内存对齐
- c/c++结构体、对象内存对齐
- C/C++中的结构体对齐问题(内存对齐)
- C/C++中的结构体对齐问题(内存对齐)
- C/C++中的结构体对齐问题(内存对齐)
- C/C++中的结构体对齐问题(内存对齐)
- C/C++中的结构体对齐问题(内存对齐)
- JBoss下布署Spring2.5和Struts2系统
- 关于用XSD文件验证字符串型的XML中特定的字段只能是几个值
- SAS FUNCTIONS
- LoadRunner下DLL的调用
- JavaScirpt多个同时入栈和入队列顺序问题
- 关于C内存组织方式____结构体对齐
- log4j.properties配置详解
- js弹出的窗口居中显示
- du
- ucos-ii 之 OSTimeTick
- MySQL:如何编写UDF
- Cacti插件
- win7 安装 vc6.0的一点经验
- 类派生的时候构造函数的调用