结构体内数据元素对齐
2013-02-27 20:13
302 查看
默认情况下,为方便结构体内元素的访问于管理,当结构体内的数据元素的长度小于处理器的位数的时候,便以结构体内的最长数据元素为对齐单位,即结构体的长度一定为最长数据元素的长度的整数倍。如果结构体内存在长度大于处理器位数的数据元素,则处理器的位数为对齐单位。
如:
#include <stdio.h>
struct
{
float a;
int b;
char c;
}node;
int main()
{
int p=sizeof(node);
printf("%d \n",p);
return 0;
}
#include <stdio.h>
struct
{
char b
char c;
}node;
int main()
{
int p=sizeof(node);
printf("%d \n",p);
return 0;
}
但是同样是对齐,不同的编译器的对齐还是有所差距,对于如下代码:
int mian()
{
int a;
char b;
int c;
printf("0x%08x ",&a);
printf("0x%08x ",&b);
printf("0x%08x ",&c);
return 0;
}
利用vc编译后结果:
0x0012ff7c
0x0012ff7b
0x0012ff80
即 b(1字节) a(4字节) c(4字节)共9字节
而Dev C++和LCC编译后的结果均为:
c(4字节)中间相隔3字节 b(1字节)a(4字节)共12字节
由此可知vc编译器要“聪明”一些。
如:
#include <stdio.h>
struct
{
float a;
int b;
char c;
}node;
int main()
{
int p=sizeof(node);
printf("%d \n",p);
return 0;
}
#include <stdio.h>
struct
{
char b
char c;
}node;
int main()
{
int p=sizeof(node);
printf("%d \n",p);
return 0;
}
但是同样是对齐,不同的编译器的对齐还是有所差距,对于如下代码:
int mian()
{
int a;
char b;
int c;
printf("0x%08x ",&a);
printf("0x%08x ",&b);
printf("0x%08x ",&c);
return 0;
}
利用vc编译后结果:
0x0012ff7c
0x0012ff7b
0x0012ff80
即 b(1字节) a(4字节) c(4字节)共9字节
而Dev C++和LCC编译后的结果均为:
c(4字节)中间相隔3字节 b(1字节)a(4字节)共12字节
由此可知vc编译器要“聪明”一些。
相关文章推荐
- 可变长度数据存储结构动态删除元素
- 数据结构—链表-单链表应用-删除元素最大的节点
- ExtJS 4.2 树形结构请求后台数据无法展示子节点,而是没点击一次请求一次数据,无限请求加载所有的父节点元素
- NumPy-快速处理数据--ndarray对象--多维数组的存取、结构体数组存取、内存对齐、Numpy内存结构
- 数据结构实验之链表七:单链表中重复元素的删除
- 解决数据结构未对齐的异常
- 数据结构实验之链表七:单链表中重复元素的删除
- 结构体数据成员对齐
- 【数据结构_顺序表_List_1038】顺序表中重复元素的删除
- 数据结构之元素拆分
- 数据结构—Problem B: 删除区间内的元素(线性表)
- 经验总结:结构的数据对齐方式对于map.find的影响
- SDUT OJ 数据结构实验之链表七:单链表中重复元素的删除
- 数据结构5:线性表中把属于la中而不属于lb中的元素放到la中
- 数据结构顺序表应用1:多余元素删除之移位算法
- 王朝 数据结构之元素位置交换
- 结构体数据对齐
- 数据结构——栈——寻找下一个较大元素
- C语言中的结构体数据存储-对齐规则
- 数据结构实验之链表七:单链表中重复元素的删除