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

转载 2013年12月02日 09:27:47

转自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)

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

相关文章推荐

【C++】计算struct结构体占用的长度

关于结构体和类所占用的长度计算方式介绍。 struct A { char a[5]; int b; short int c; }structA; 在上例中,要计算 size...
  • nisxiya
  • nisxiya
  • 2014年03月29日 02:21
  • 1835

c/c++中使用sizeof计算结构体struct和类class的长度(字节)

前言 在默认情况下,为了方便对结构体内元素的访问和管理,当结构体内的元素长度都小于处理器的位数的时候,便以结构体内最长的数据元素为对齐单位,也就是说,结构体的长度一定是最长的数据元素的整数倍。如果结构...
  • hsd2012
  • hsd2012
  • 2016年03月24日 09:44
  • 2318

结构体struct的自然对齐问题(经典)

结构体struct的自然对齐问题下面的机构体struct A{    char c;    int i;    char cc;};它的sizeof()是多少呢? 如果是紧凑对齐的话,当然是sizeo...

-fpack-struct编译开关的作用

-fpack-struct 该编译器选项解决了结构中字节对齐问题。 原理和评价:  -fpack-struct将所有结构成员无缝隙地压缩在一起。因为它使代码程序效率大大降低,且结构成...

C语言结构体(struct)常见使用方法

结构体与函数: 关于传参,首先: void func(int); func(a.b.c); 把结构体中的int成员变量当做和普通int变量一样的东西来使用,是不用脑子就想到的一种方法。 另外两...

android 后台长时间执行周期性定时任务 解决方案收集

android 后台长时间执行周期性定时任务 解决方案收集 分类: android2013-11-06 16:23 823人阅读 评论(2) 收藏 举报 我觉得用以下东西就可以: ...
  • pi9nc
  • pi9nc
  • 2014年01月22日 09:52
  • 4609

一个Activity的显示过程总结(二)

一个Activity的显示过程总结(二) callActivityOnCreate installDecor handleResumeActivity

Java中发送结构体struct(xml字符串及包体长度) 到C/C++[正解]

最近给个朋友做个网站的客户端,使用C/S模式,Client为VC6开发,Server为Java,通过Socket通信。由于Client这边为C++,所以,在接受Java发过来的数据包时,需要知道发来的...

struct打包模块加强版!支持任意长度字符串解包

用过python的struct模块的人都知道,struct模块的打包并不方便,尤其是处理字符串上。字符串的长度必须打包的时候计算好,比如‘hello’ 那么打包格式 fmt就必须是‘5s’,因此fmt...

sizeof(struct var) 的长度如何计算

http://goodfunman.itpub.net/post/15807/148405 本文主要包括二个部分,第一部分重点介绍在VC中,怎么样采用sizeof来求结构的大小,以及容易出现的问...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C++中struct长度与分别取struct元素的长度和不同
举报原因:
原因补充:

(最多只允许输入30个字)