编译对齐方式设置

17 篇文章 0 订阅
12 篇文章 0 订阅

from: http://www.2cto.com/kf/201309/245833.html

GCC 4.7+ version 字节对齐
2013-09-25 08:22:04      我来说两句       作者:Stroot_Zhang
收藏     我要投稿
1、位域对齐
 
3.7版本之后GCC都默认使用了-mms-bitfields,此选项意义为使用Microsoft的方式进行对齐操作,其对齐策略为将对所有类型相同的位域合并到一起。与之相对的是GCC对其方式,其对齐策略为将所有位域合并到一起,并不区分位域类型。
 
如下例:
 
[cpp] 
struct {  
unsigned long long c : 1;  
unsigned int a : 1;  
unsigned int b : 1;  
}  
 
Mircrosoft对齐方式将合并类型相同的a、b,为之分配8个字节,而对于c,则单独分配8个字节,所以上述结构体在此对齐方式下大小为16.
GCC对齐方式将不区分类型合并所有的位域,并根据原类型中最大尺寸分配位域保存所需的字节数。譬如对于上述结构,最大尺寸为long long,所以上述结构体大小为8.
 
 
此结论可以通过为struct添加不同的GCC结构属性测试得到。
 
[cpp]  
struct fields {  
    unsigned long long c :1;  
    unsigned int a :1;  
    unsigned int b :1;  
//}__attribute__ ((__ms_struct__)); //用于测试Microsoft对齐方式。得到sizeof(fields)结果为16。  
//}__attribute__ ((__gcc_struct__));//用于测试GCC对齐方式。得到sizeof(fields)结果为8。  
 
 
从gcc与ms(Microsoft)的对齐策略可见,gcc的对齐方式相对更加节约存储空间。
 
 
2、结构对齐
 
先看一个结构体:
 
[cpp] 
struct struct_ {  
    char first[1];  
    long int second;  
    char third[1];  
};  
 
此结构体使用默认的GCC选项编译后,既默认使用-mms-bitfields选项的情况下,将得到大小为9字节的存储空间。
这是因为对于32位操作 系统,GCC默认对齐字节为4字节,在使用MS结构对齐策略的情况下,GCC在处理第一个变量时保持其尺寸不变,既为1字节,在处理第二个变量时同样保持其尺寸不变,既为4字节,在处理第三个也是最后一个变量时,扩展其尺寸至对齐尺寸4字节。因此最后得到的总结构大小为1+4+4=9字节。
 
总而言之,MS的对齐策略仅对结构中最后一个变量起作用。
 
如果关闭默认的MS对齐策略(通过为GCC添加-mno-ms-bitfields参数),转而使用GCC的对齐策略,上述结构的尺寸将会是多少?
 
测试的结果是:12。为何?这是因为GCC将对齐策略应用在了结构体中的每个变量上,对于非4字节的整数倍的char类型变量first[1]、third[2],GCC都将其扩展为4个字节,对于second,由于其类型大小为4字节,所以GCC保持其大小不变。扩展完成后,结构体的大小为:4+4+4=12字节。
 
 
3、强制设定对齐方式
 
字节对齐有利于整块读取数据,提高数据吞吐量,但是这是在牺牲存空间的情况下得到的,而在实际应用中,比如网络环境下,为了减少数据传输量,我们并不希望使用字节对齐方式,这时需要关闭字节对齐。
 
在程序的移植过程中,比如将32bit系统下的程序移植到64bit系统下,原有的字节对齐方式可能无法达到提高数据吞吐的目的,因此,我们需要更改字节对齐方式。
 
如何关闭?如何更改?
 
GCC提供了几种方式:
 
3.1、通过属性方式改变:
 
__attribute__ ((__ms_struct__)) 指定使用MS对齐策略
__attribute__ ((__gcc_struct__)) 指定使用GCC对齐策略
 
__attribute__ ((__packed__)) 指定使用最少存储空间对齐策略:合并所有位、对变量使用单字节方式对齐。
3.2、通过标识符声明方式:
 
#pragma pack(N) 设定对齐方式为N字节。
 
#pragma pack() 设定对齐方式为上一次对齐方式。
 
#pragma pack(push[, n]) 保存当前对齐方式并设置对齐方式为N字节。
 
#pragma pack(pop) 恢复最近一次保存的对齐方式。
 
对于i386构架,GCC专门提供了如下3个声明控制对齐方式:
 
#pragma ms_struct on 启用MS对齐方式。
 
#pragma ms_struct off 关闭MS对齐方式。
 
#pragma ms_struct reset 重置当前对齐方式为默认对齐方式。
 
3.3 通过设置GCC编译参数方式:
-fpack-struct[=N] 设定对齐方式为N字节对齐,不带”=N“时默认为4字节对齐。
-mno-ms-bitfields 关闭MS对齐策略,使用GCC对齐策略。

智慧旅游解决方案利用云计算、物联网和移动互联网技术,通过便携终端设备,实现对旅游资源、经济、活动和旅游者信息的智能感知和发布。这种技术的应用旨在提升游客在旅游各个环节的体验,使他们能够轻松获取信息、规划行程、预订票务和安排食宿。智慧旅游平台为旅游管理部门、企业和游客提供服务,包括政策发布、行政管理、景区安全、游客流量统计分析、投诉反馈等。此外,平台还提供广告促销、库存信息、景点介绍、电子门票、社交互动等功能。 智慧旅游的建设规划得到了国家政策的支持,如《国家中长期科技发展规划纲要》和国务院的《关于加快发展旅游业的意见》,这些政策强调了旅游信息服务平台的建设和信息化服务的重要性。随着技术的成熟和政策环境的优化,智慧旅游的时机已经到来。 智慧旅游平台采用SaaS、PaaS和IaaS等云服务模式,提供简化的软件开发、测试和部署环境,实现资源的按需配置和快速部署。这些服务模式支持旅游企业、消费者和管理部门开发高性能、高可扩展的应用服务。平台还整合了旅游信息资源,提供了丰富的旅游产品创意平台和统一的旅游综合信息库。 智慧旅游融合应用面向游客和景区景点主管机构,提供无线城市门户、智能导游、智能门票及优惠券、景区综合安防、车辆及停车场管理等服务。这些应用通过物联网和云计算技术,实现了旅游服务的智能化、个性化和协同化,提高了旅游服务的自由度和信息共享的动态性。 智慧旅游的发展标志着旅游信息化建设的智能化和应用多样化趋势,多种技术和应用交叉渗透至旅游行业的各个方面,预示着全面的智慧旅游时代已经到来。智慧旅游不仅提升了游客的旅游体验,也为旅游管理和服务提供了高效的技术支持。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值