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仅经过自己测试,并未在高峰期进行测试,代码质量很差,因为赶工,套用去年模板并未使用设计模式. 代 ...
随机推荐
- APICloud框架--sublime使用自定义loader
官方的apploader调试器,只是有官方的一些模块,如果我们使用非官方的模块就要使用自定义loader进行调试.接下来就走一边sublime设置自定义loader的步骤 修改config.xml 打 ...
- Github代码管理教程
https://desktop.github.com/ 目录 Create and use a repository Start and manage a new branch Make change ...
- Zookeeper集群介绍及其搭建
1 Zookeeper集群简介 1为什么搭建Zookeeper集群 大部分分布式应用需要一个主控.协调器或者控制器来管理物理分布的子进程.目前,大多数都要开发私有的协调程序,缺乏一个通用机制,协调程序 ...
- idea 中使用dataBase插件
最近一段时间重新开始学习Java 使用IntelliJ 发现有个链接数据库插件挺好用的,并且反应速度还挺快的记录下. 点击步骤:View → Tool Windows → data 进行数据库链接 发 ...
- js滚动页面到固定位置进行操作
$(window).scroll(function () { var scrollTop = $(this).scrollTop(); var scrollHeight = $("#div& ...
- Rsync 恢复 libselinux.SO.1
libselinux.SO.1 这个文件对 CentOS 7很重要, 误删掉后,会导致很多命令无法使用(比如yum ,rpm 命令),利用rsync这个工具来修复. 服务端执行如下配置:(选取正常 ...
- C# WinForm 第一个项目控件使用心得
1.控件心得 1.1 基础控件 panel 作用:布局 难点:重绘边框改变颜色 重绘panel里如果有fill填充控件 panle的padding要改个值 private void pnlPaintB ...
- python代码技巧总结(更新至17条)
怎么提高代码水平?答:看牛逼的代码! 牛逼的代码怎么写的?简单,明确,优雅! 怎么简单,明确,优雅?学技巧! 下面搜罗了一些有才格子褂青年的总结,哈哈 1.检查 Python 中的对象 调用 dir( ...
- umount - 卸载文件系统
总览 umount [-hV] umount -a [-nrv] [-t vfstype] umount [-nrv] device | dir [...] 描述 umount 可以卸除当前挂载在文件 ...
- ARM TK1 安装ROS- indigo
之前安装不成功是因为校园网无法访问源的问题. Ubuntu ARM install of ROS Indigo There are currently builds of ROS for Ubuntu ...