sizeof,真正终结版GCC与VC
在VC6.0中sizeof结果是16.我电脑上装了个linux虚拟机,在虚拟机上GCC中结果是12,
恩不同编译器默认对齐数值不一样。 VC 默认为 8 gcc 默认为 4 有个编译参数控制对齐。 #pragma pack(4) 加上这个,对齐应该一样了。
VC和GCC默认的都是4字节对齐,编程中可以使用#pragma pack(n)指定对齐模数。出现以上差异的原因在于,VC和GCC中对于double类型的对齐方式不同。
Win32平台下的微软VC编译器在默认情况下采用如下的对齐规则: 任何基本数据类型T的对齐模数就是T的大小,即sizeof(T)。
比如对于double类型(8字节),就要求该类型数据的地址总是8的倍数,而char类型数据(1字节)则可以从任何一个地址开始。
Linux下的GCC奉行的是另外一套规则:任何2字节大小(包括单字节吗?)的数据类型(比如short)的对齐模数是2,而其它所有超过2字节的数据类型(比如long,double)都以4为对齐模数。
复杂类型(如结构)的默认对齐方式是它最长的成员的对齐方式,这样在成员是复杂类型时,可以最小化长度。 struct{char a;double b;}
在VC中,因为结构中存在double和char,按照最长数据类型对齐,char只占1B,但是加上后面的double所占空间超过8B,所以char独占8B;而double占8B,一共16Byte。
在GCC中,double长度超过4字节,按照4字节对齐,原理同上,不过char占4字节,double占两个4字节,一共12Byte。
http://zhidao.baidu.com/link?url=iWrBy6yXFRy-vXDmtX3HWVJF7GYVFciWUZHNywJJlUeCGBsBSr32nc5OY2B22mCArHml49fUk-dKxqfAtustVa
原帖由 scutan 于 2007-6-28 14:04 发表
[CODE]
#include<stdio.h>struct A
{
double l;
int i;
int b;
char c;
};int main()
{
struct A m[2];
printf("%d\n", sizeof(struct A));
pri ...
http://bbs.chinaunix.net/thread-955085-1-1.html 每个特定平台上的编译器都有自己的默认“对齐系数”(也叫对齐模数)。程序员可以通过预编译命令#pragma pack(n),n=1,2,4,8,16来改变这一系数,其中的n就是你要指定的“对齐系数”。在lz的程序中,n默认是4。
在这个前提下分析lz得到的结果: 4字节对齐(#pragma pack(4))
sizeof(m[0]) = 20;
分析过程:
1)成员数据对齐
struct A {
double l; /* 长度8 > 4 按4对齐;起始offset=0 0%4=0;存放位置区间[0,7] */
int i; /* 长度4 = 4 按4对齐;起始offset=8 8%4=0;存放位置区间[8,11] */
int b; /* 长度4 = 4 按4对齐;起始offset=12 12%4=0;存放位置区间[12,15] */
char c; /* 长度 1 = 4 按1对齐;起始offset=16 16%1=0;存放位置区间[16] */
};
成员总大小为17,
整体对齐系数=min(max (double, int, char), 4) = 4;
整个结构体的大小=20,为什么不是上面算出来的17呢?这里涉及到一个叫做“圆整”的概念。
什么叫“圆整”?比如在这个例子,从17开始,看看那个位置可以被“整体对齐系数(4)”整除,17,18,19都不合适,所以到20,圆整结束。
这也解释了为什么第二个结构体开始的位置不能被8整除,其实只要个能被4整除就可以了。 http://blog.csdn.net/ehui928/article/details/546391
sizeof,真正终结版GCC与VC的更多相关文章
- struct内存对齐1:gcc与VC的差别
		
struct内存对齐:gcc与VC的差别 内存对齐是编译器为了便于CPU快速访问而采用的一项技术,对于不同的编译器有不同的处理方法. Win32平台下的微软VC编译器在默认情况下采用如下的对齐规则: ...
 - Qt Windows下链接子系统与入口函数(终结版)(可同时存在main和WinMain函数)
		
Qt Windows下链接子系统与入口函数(终结版) 转载自:http://blog.csdn.net/dbzhang800/article/details/6358996 能力所限,本讨论仅局限于M ...
 - coursera_poj_魔兽世界终结版
		
五个下午的时间!!!!终于过了!!有史以来做的最复杂的一个题这是我迄今为止做的最复杂也最具有挑战的一个oj作业.虽然之前做过比这个规模一些作业项目,但是往往有简单的模块框架,模块之前的关系也只是有些简 ...
 - IOS之UI--小实例项目--添加商品和商品名(使用xib文件终结版) +  xib相关知识点总结
		
添加商品和商品名小项目(使用xib文件终结版) 小贴士:博文末尾有项目源码在百度云备份的下载链接. xib相关知识点总结 01-基本使用 一开始使用xib的时候,如果要使用自定义view的代码,就需要 ...
 - 蜻蜓特派员 Windows XP SP3 纯净终结版
		
蜻蜓特派员Windows XP SP3 纯净安装版 终结版,系统纯净无广告.无插件,网卡等驱动和运行库齐全,安全更新补丁全网最新!微软停止了 Windows XP 的支持之后还是偶尔为 WinXP 提 ...
 - [转]springcloud(九):配置中心和消息总线(配置中心终结版)
		
https://www.cnblogs.com/ityouknow/p/6931958.html springcloud(九):配置中心和消息总线(配置中心终结版) 我们在springcloud(七) ...
 - SQL Server数据全同步及价值分析[终结版]
		
SQL Server数据全同步[终结版] 版权全部.转载请注明出处.谢谢! 经过两天的同步编写和測试.出了第一个Release版本号: 1. 本函数仅支持单向同步.即从一个主数据库想多个从数据库同步 ...
 - Qt编写输入法V2018超级终结版
		
对于qt嵌入式linux开发人员来说,输入法一直是个鸡肋问题,要么不支持实体键盘同步,要么不能汉字输入,要么不支持网页输入等,这几年通过陆续接触大量的各种输入法应用场景客户,得到真实需求,不断改进,最 ...
 - 马后炮之12306抢票工具(四)--抢票Demo,2014年1月9日终结版
		
时隔一年多,终于朋友的忽悠下吧抢票Demo的最后一步完善了,与2014年1月9日成功生成车票. Demo仅经过自己测试,并未在高峰期进行测试,代码质量很差,因为赶工,套用去年模板并未使用设计模式. 代 ...
 
随机推荐
- AcWing  101. 最高的牛   (差分)      打卡
			
有 NN 头牛站成一行,被编队为1.2.3…N,每头牛的身高都为整数. 当且仅当两头牛中间的牛身高都比它们矮时,两头牛方可看到对方. 现在,我们只知道其中最高的牛是第 PP 头,它的身高是 HH ,剩 ...
 - The method setPositiveButton(int, DialogInterface.OnClickListener) in the type AlertDialog.Builder i
			
参考资料: http://blog.csdn.net/competerh_programing/article/details/7377950 在创建Dialog的时候,出现: The method ...
 - Linux内核知识杂记
			
1.内核调试手段 1.printk打印内核状态 2.产生opps时使用GDB查看调用栈 2.内核空间和用户空间区别,通信方式有哪些? Linux简化了分段机制,使得虚拟地址与线性地址总是一致,因此,L ...
 - ORM-Dapper:Dapper列表
			
ylbtech-ORM-Dapper:Dapper列表 1.返回顶部 1.1. https://dapper-tutorial.net/ 1.2. 2.1. https://www.nuget.org ...
 - POJ 1673 EXOCENTER OF A TRIANGLE(解三角形重心)
			
题目链接:http://poj.org/problem?id=1673 AC代码: #include<cstdio> #include<cmath> #include<a ...
 - 拾遗:nmcli 连接 wifi
			
... nmcli device wifi list nmcli device wifi connect SSID password PASSWORD ...
 - 剑指offer——04二维数组中的查找
			
题目: 数组中唯一只出现一次的数字.在一个数组中除一个数字只出现一次之外,其他数字都出现了三次.请找出那个只出现一次的数字. 题解: 如果一个数字出现三次,那么它的二进制表示的每一位(0或者1)也出现 ...
 - 021_IO流
			
IO流 I——input 输入 O——Output 输出 文件 File 所有文件类的父类 创建方式 File file = new File("文件路径"); 文件对象常用的方法 ...
 - TortoiseGit密钥设置
			
需要用到TortoiseGit的puttykey generator工具来生成既适用于github的rsa密钥也适用于TortoiseGit的ppk密钥. 1. 安装完成TortoiseGit后 ...
 - json传参报错
			
restful接口报错: com.fasterxml.jackson.core.JsonParseException: Unexpected character ('e' (code 101)): w ...