关闭

C++中struct长度与分别取struct元素的长度和不同

标签: c++linux字节对齐
1893人阅读 评论(0) 收藏 举报
分类:

转自http://bbs.chinaunix.net/thread-794334-1-1.html


GNU C/C++中,sizeof (struct xys) 与struct成员size之和不一致
X86,Linux Redhat 8.0,gcc/g++ v3.2 

struct xyz
{

	char a;

	double b;

} xyz;


32位的编译器下,因为性能的考虑,对于struct(也包含union等其它数据结构)的大小和每个成员变量的位置都根据寄存器/内存访问值的边界要求做了align。这就使得sizeof(xyz) = 16 而不是实际成员所占空间之和 sizeof(char) + sizeof(double) = 9


一般来说,这不成问题,不过,对于那些空间紧张,或者有特殊要求的应用,就需要考虑struct的紧凑实现了。

譬如,将服务器端传入的固定格式的数据包直接映射到一个结构上去,便于访问:

union 
{

	char bytes[9];

	struct xyzstruct data;

} uvw;


如果这里的struct/union是紧凑实现的,那么我们可以通过uvw.data来直接访问bytes中的数据,不用再另外编写代码了。


解决办法:

1. gcc的编译选项“-fpack-struct”

可以去除struct结构中额外的hole,缺点是,影响应用中所有的struct,包括从其它库中引入的struct结构



2. __attribute__ ((packed)) 声明

struct 
{
	char a; 
	double b;
} xyz __attribute__ ((packed));


不过这种简单格式的声明只对C有效,在C++中,你必须对struct中的每个成员(size>1)进行这样的声明:

struct 
{

	char a;

	double b __attribute__ ((packed));

	int c __attribute__ ((packed));

} xyz;


3. 预编译选项 #pragma pack(n)

这里的n是通知编译器对此“pragma”行后出现的所有数据结构(包括stuct/union)采用n字节方式对齐(align)。如果n=1,那么表示全紧凑,struct中不会出现任何占位的hole。如果n是空,表示回复到编译器缺省的设置(一般=8)

#pragma pack(1)

//此段内所有数据结构全紧凑

0
0

猜你在找
【直播】计算机视觉原理及实战—屈教授
【套餐】深度学习入门视频课程—唐宇迪
【套餐】Hadoop生态系统零基础入门--侯勇蛟
【套餐】嵌入式Linux C编程基础--朱有鹏
【套餐】2017软考系统集成项目——任铄
【套餐】Android 5.x顶级视频课程——李宁
【直播】广义线性模型及其应用——李科
【直播】从0到1 区块链的概念到实践
【直播】机器学习之凸优化——马博士
【套餐】微信订阅号+服务号Java版 v2.0--翟东平
查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:125588次
    • 积分:1622
    • 等级:
    • 排名:千里之外
    • 原创:37篇
    • 转载:49篇
    • 译文:0篇
    • 评论:6条
    文章分类
    最新评论