「数据对齐」问题心得
最近在复习C语言,感觉自己以前对C的学习和认识简直是shit。今天看到有关结构体中成员存储分配的数据对齐问题,想和大家分享一下,也谈不上心得,就是想总结一下而已。
有关数据对齐有两种,一种为自然对齐,一种为强制对齐。1.先看自然对齐,有如下程序:
#include <stdio.h> typedef struct {char c1;long l;char c2;double d; }a; typedef struct {char c1;char c2;long l;double d; }b;int main() { printf("%d,%d\n",sizeof(a),sizeof(b));return 0; }
打印结果为:
分析如下:两个结构体的成员变量完全相同,但是次序不同,数据对齐后结构体所占空间也不尽相同。结构体a在自然对齐后的状态如下:
c1为char类型占用一个字节,之后为了让l自然对齐,因此需要填充3个字节。l为long型,占用4个字节,c2为char型,为了让双精度的d对齐,需要在c2添加7个字节,之后d占用8个字节。所以结果为:1+3+4+1+7+8=24。按同样的规则易得结构体b所占空间为16。
关于自然对齐规则也可以总结为:各成员变量存放的地址相对于结构的起始地址的偏移量为sizeof(类型)或其整数倍。结构的总大小是其成员中最大类型的sizeof(该类型)整数倍。所以在定义结构体时最好把结构中的变量按照类型大小从小到大声明,以减少中间的填补空间。
2.关于强制对齐,使用#pragma pack(n) 设定对齐系数。
#pragma pack(4) typedef struct {char c1;long l;char c2;double d; }a;#pragma pack()
打印结果如下,a的大小变为了20
设n=8
#pragma pack(8) typedef struct {char c1;long l;char c2;double d; }a;#pragma pack()
a类型的大小和自然对齐的结果相同还是24
因为使用#pragma pack(n) 设定对齐系数分为两种情况:第一、如果n大于等于该成员所占用的字节数,那么偏移量必须满足默认的对齐方式,即自然对齐方式。第二、如果n小于该成员的类型所占用的字节数,那么偏移量为n的倍数,不用满足默认的对齐方式。结构的总大小也有个约束条件,分下面两种情况:如果n大于所有成员变量类型所占用的字节数,那么结构的总大小必须为占用空间最大的变量占用的空间数的倍数; 否则必然为n的倍数。
那个某*,街拍刚巴呆~
【参考文献】「程序员求职成功路」
转载于:https://www.cnblogs.com/hardcandy/archive/2011/08/08/2131377.html
「数据对齐」问题心得相关推荐
- 「数据游戏」:使用 ARIMA 算法预测三日后招商银行收盘价
作者:天琼,「数据游戏」优胜队伍成员 介绍 本文整理记录了参与的一次小型数据分析竞赛「数据游戏」,竞赛目标是预测2019年5月15日A股闭市时招商银行600036的股价. 主要思路是利用ARIMA算法 ...
- 「数据ETL」从数据民工到数据白领蜕变之旅(五)-使用dotNET脚本实现SSIS无限扩展...
在前面一文中,正式引出了SSIS专业数据ETL工具,笔者仅能作引路作用,未能使用文章的方式给大家写出更多的入门级的文章,希望读者们可以自行根据分享的学习资源自行完成入门及进阶的学习. 同时也想给大家分 ...
- 从「猜画小歌」,谈企业的「数据困惑」该何去何从?
「猜画小歌」坐拥5000万组大数据,你怎么看? Google很会玩. 当所有做云计算.大数据.手机的厂商在广而告之其先进的技术能力时,通常采用直白宣讲式的说教,落地的东西却很少,听多了也就是过眼烟云. ...
- 不让「数据孤岛」成为 AI 发展的绊脚石,「联邦学习」将成突破口?...
雷锋网 AI 科技评论按:人工智能经过漫长发展,近些年成功突破技术与算力上的限制,因此得以在新世纪发挥着举足轻重的作用.不过随之而来是一系列的新问题--最典型的比如「数据孤岛」问题.该问题一日不被解决 ...
- 「数据游戏」:使用岭回归预测招商银行的股价
作者:Max,「数据游戏」优胜队伍成员 前阵子报名参加了「数据游戏」比赛,题目是预测5月15号(星期三)招商银行的股价,截止时间是在5月12号(星期天).在本次预测中,我用到的是岭回归. 岭回归 岭回 ...
- 花了几百万,仍然无法消除「数据孤岛」,这份数字化建设方案下载
中国信息化建设发展了几十年,像政府和央企.国企这类不差钱的,很多系统购买的原因之一就是"消除数据孤岛".这个口号喊了几十年,结果系统是越来越多,数据孤岛也越来越严重.就像给裤子打补 ...
- 史上最强攻略!手把手教你建「数据中台」!
文章转自「首席数字官」 ID:ChiefDigitalOfficer 作者:李国欢 4 月 24 日晚,由数澜科技联合锦囊专家共同打造的<数据中台硬核汇>系列线上微课第一讲火热开启.100 ...
- 分享预告:「数据安全问题」+「 股权与期权」
这些点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 本周星球分享话题预告 - 技术人系列:一个给阿里提的 ...
- 全文详解:「深度学习」如何协助处理医疗中的「数据难题」
原文来源:WordPress 作者:Luke Oakden-Rayner 「雷克世界」编译:嗯~是阿童木呀.KABUDA.EVA 医疗数据很难处理. 在医学成像中,数据存储(档案)是基于临床假设进行操 ...
最新文章
- ASP.NET 2.0角色及成员管理
- jQuery Form Plugin (jquery表单插件)
- c语言程序设计棋盘不对齐,经典c语言程序设计例(55页)-原创力文档
- 第13章:项目合同管理(1)-章节重点
- 笔记-项目范围管理-需求工程-需求管理
- 广播网关GPC为MDS多媒体调度再添虎翼
- C#窗体应用程序崩溃解决方法总结
- 盘点Linux下19 个有趣的命令!
- linux端口 fcs校验,我如何接收错误的以太网帧并禁用CRC / FCS计算?
- 【渝粤教育】电大中专办公设备使用与维护 (2)_1作业 题库
- linux终端安装mingw编译器_C/C++编译器MinGW的安装与配置
- Mac 用快捷键选取文字,省时省力提高工作效率
- Unity3DGUI:刚体碰撞及消息传递
- idea导入项目常见异常处理
- 曼切斯特编码波特率和比特率的关系
- 由于 Exception.tostring()失败,因此无法打印异常字符串
- INT 10H 中断简介
- [转载]JSP利用组件实现文件上传的全攻略
- 1.Btn、Div特效---利用border
- 到底什么样的网站才需要办理ICP许可证?