概述
思考:为什么要字节对齐? 内存对齐的一些原则?
原文作者:andy572633
原文地址:http://blog.csdn.net/andy572633/article/details/7213465
空间换时间
结构体内成员按自身长度自对齐
#### 结构体的总大小为结构体的有效对齐值的整数倍
结构体的有效对齐值的确定(会有编译器优化问题):
1)当未明确指定时,以结构体中最长的成员的长度为其有效值
2)当用#pragma pack(n)指定时,以n和结构体中最长的成员的长度中较小者为其值。
3)当用attribute ((packed))指定长度时,强制按照此值为结构体的有效对齐值
结构体对齐的一些题目
32位机器上定义如下结构体
struct xx
{
long long _x1;
char _x2;
int _x3;
char _x4[2];
static int _x5;
};
int xx::_x5;
sizeof(xx) = 24;
首先静态变量不用管,按最长8个字节对齐, 其中 _x2 _x3 一起占8个字节,_x2扩展后占4个字节,char _x4[2]直接扩展占8个字节
如下的结构
struct xx
{
long long _x1;
char _x2;
int _x3;
char _x4[2];
int xt;
static int _x5;
};
int xx::_x5;
sizeof(xx) = 24
struct st
{
char ch, *ptr;
union
{
short a, b;
unsigned int c : 2, d : 1;
};
bool f;
struct st *next;
};
sizeof(st) = 20
//ch 1(对齐4)
//ptr 4
//union 4 这里和unsigned intc : 2 , d : 1; 位域 c占两个2 然后紧接着存d 占1 然后对齐 是4
//bool 1(对齐 4)
//next 4
结构体(struct)中所有变量是“共存”的——优点是“有容乃大”,全面;缺点是struct内存空间的分配是粗放的,不管用不用,全分配。
联合体(union)中是各变量是“互斥”的——缺点就是不够“包容”;但优点是内存使用更为精细灵活,也节省了内存空间。
union example 1
union example 2
#pragma pack(k) 改变字节对齐大小
解析参考
作者:chengonghao
地址:http://blog.csdn.net/chengonghao/article/details/52160632
最后
以上就是体贴睫毛膏为你收集整理的C语言 字节对齐#pragma pack(k) 改变字节对齐大小的全部内容,希望文章能够帮你解决C语言 字节对齐#pragma pack(k) 改变字节对齐大小所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复