C/C++结构体四字节数据对齐
为了避免混淆,做如下规定,以下代码若不加特殊说明都运行于32位平台,结构体的默认对齐值是8,各数据类型所占字节数分别为
char占一个字节
int占四个字节
double占八个字节。
两个例子
请问下面的结构体大小是多少?
这个呢?
在公布答案之前先看一下对齐的规则。
对齐规则
一般来说,结构体的对齐规则是先按数据类型自身进行对齐,然后再按整个结构体进行对齐,对齐值必须是2的幂,比如1,2, 4, 8, 16。如果一个类型按n字节对齐,那么该类型的变量起始地址必须是n的倍数。比如int按四字节对齐,那么int类型的变量起始地址一定是4的倍数,比如0x0012ff60,0x0012ff48等。
数据自身的对齐
数据自身的对齐值通常就是数据类型所占的空间大小,比如int类型占四个字节,那么它的对齐值就是4
整个结构体的对齐
整个结构体的对齐值一般是结构体中最大数据类型所占的空间,比如下面这个结构体的对齐值就是8,因为double类型占8个字节。
例子答案
有了上面的基础,再回过头去看看一开始的两个例子
先看结构体Test
1 c是char类型,按1个字节对齐
2 i是int类型,按四个字节对齐,所以在c和i之间实际上空了三个字节。
整个结构体一共是1 + 3(补齐)+ 4 = 8字节。
再看Test1
i是int类型,按4字节对齐
d是double类型,按8字节对齐,所以i和d之间空了4字节
c是char类型,按1字节对齐。
所以整个结构体是 4(i) + 4(补齐)+ 8(d) + 1(c) = 17字节,注意!还没完,整个结构体还没有对齐,因为结构体中空间最大的类型是double,所以整个结构体按8字节对齐,那么最终结果就是17 + 7(补齐) = 24字节。
书写结构体的建议
我们对Test1做一点改动
这时Test1的大小就变成了16,而不是24了,节省了8个字节!可见结构体中成员的书写顺序对结构体大小的影响还是很大的,一个好的建议是,按照数据类型由小到大的顺序进行书写。
如何查看结构体的对齐值
使用预处理命令
#pragma pack(show)
该命令来查看当前的对齐值,但是要注意的是,结果是以warning的形式输出的,所以要在VS的警告窗口中才看得见,如下
warning C4810: value of pragma pack(show) == 8
使用Visual Studio选项(以Visual Studio 2008为例)
Projects-Properties-Configuration Properties-C/C++-Code generation-Struct Member Alignment, 如果没有修改过,则默认值是Default,即8字节对齐。
如何修改结构体的对齐值
使用预处理指令
#pragma pack(num)
num是结构体的对齐值,比如下面的例子按四个字节对齐。
#pragma pack(4)
使用Visual Studio选项(以Visual Studio 2008为例)
Projects-Properties-Configuration Properties-C/C++-Code generation
参考
http://msdn.microsoft.com/en-us/library/ms253949.aspx
http://msdn.microsoft.com/en-us/library/ms253935.aspx
C/C++结构体四字节数据对齐相关推荐
- C语言基础 - 结构体类型字节对齐总结
一.什么是字节对齐 在计算机中,内存空间是按照字节(1B = 8 bit)划分的,每一个字节都有一个编号,这就是字节的地址.理论上可以从任意起始地址访问任意数据类型的变量,但在实际使用中,访问特定数据 ...
- 结构体struct的自然对齐问题(经典)
结构体struct的自然对齐问题下面的机构体 struct A { char c; int i; char cc; }; 它的sizeof()是多少呢? 如果是紧凑对齐的话,当 ...
- C语言结构体的大小 — — 内存对齐和位域
C语言结构体对齐 C语言结构体对齐也是老生常谈的话题了.基本上是面试题的必考题.内容虽然很基础,但一不小心就会弄错.写出一个struct,然后sizeof,你会不会经常对结果感到奇怪?sizeof的结 ...
- c语言结构体变量所占字节计算,【C语言】结构体占用字节数及存储与空间分配...
我们都知道在数据类型中,char类型占1个字节,short占2个字节,int占4个字节,long占8个字节等等. 在计算结构体大小时需要考虑其内存布局,结构体在内存中存放是按单元存放的,每个单元多大取 ...
- 1-3 MATLAB符号变量的使用、符号变量转为匿名函数、向量值匿名函数、符号变量转为向量值函数、结构体批量提取数据
1-3 MATLAB符号变量的使用.符号变量转为匿名函数.向量值匿名函数.符号变量转为向量值函数.结构体批量提取数据 文章目录 1-3 MATLAB符号变量的使用.符号变量转为匿名函数.向量值匿名函数 ...
- c语言怎么往结构体中传数据,怎么把文件数据写入结构体 c语言 怎么将结构体写入文件...
怎么把结构体的数据写到文件中 C语言把一个结构体数组写入文件分三步: 以二进制写方式(wb)打开文件 调用写入函数fwrite()将结构体数据写入文件 关闭文件指针 相应的,读文件也要与之匹配: 以二 ...
- C#:钩子、委托、匿名、事件、结构体转字节数组、多线程操纵控件、UDP
事件 C#事件分为几个步骤: 定义事件 定义处理函数 为事件添加处理函数 激活事件 事件被激活后自动调用处理函数. public event messagehandleer shenzhijiangl ...
- 转 结构体中字节对齐问题(转载)
struct MyStruct { double dda1; char dda; int type }; 对结构MyStruct采用sizeof会出现什么结果呢?sizeof(MyStruct)为多少 ...
- c# 结构体 4字节对齐_【专题4:平时遇到的问题】 之 【3.由结构体字节对齐引发的通信故障】...
希望本是无所谓有,无所谓无的,这正如脚下的路,其实地上本没有路,走的人多了,也便成了路....原创不易,文章会持续更新,感谢您的关注 1.问题由来 MCU给上位机发送的一帧数据中,总是多一个字节,调试 ...
最新文章
- C#简单操作MongoDB
- OpenCV使用VideoWriter和VideoCapture的实例(附完整代码)
- iscsi介绍及iscsi target配置
- try{}里有一个 return 语句,那么紧跟在这个 try 后的 finally {}里的 code 会 不会被执行,什么时候被执行,在 return 前还是后?...
- 【渝粤教育】 国家开放大学2020年春季 1260软件工程 参考试题
- Linux 环境变量PATH设置和查看etc/profile和bashrc的区别
- webservice调用天气服务
- box-sizing属性
- 转:神奇的Fastcgi_Finish_Request
- C#2.0 泛型初探 (特性一览)
- linux motion 分辨率,gtf 来调整Linux系统中分辩率问题分享
- grid安装前检查报PRVE-0426:/dev/shm less than the require
- 蚂蚁如果上市成功,价格崩盘是必然的
- 一款比较好看的javascript轮播图代码
- 机器学习与物理科学(四)(Machine learning and the physical sciences)
- Wed Sep 16 2020 00:00:00 GMT+0800 (中国标准时间)时间转换为mysql date类型
- worldpress或zblog安装时建立数据库连接时出错
- Are you trying to connect to a TLS-enabled daemon without TLS?
- 人生励志语录 排比句
- Uncaught SyntaxError: Unexpected token < in JSON at position 0 at JSON.parse (<anonymous>)
热门文章
- 高压包输出信号经过整流后形成直流电流
- 2021年春季学期-信号与系统-第十三次作业参考答案-第二小题
- python如何自定义模块_python自定义模块和开源模块使用方法
- 苹果自带相册打马赛克_老王被绿?iOS 13惊现漏洞,马赛克去除
- html中的js点击ipunt后加一,iphone 端 ipunt输入框光标偏移
- oracle链接字符串java,java连Oracle连接字符串写法
- hal库开启中断关中断_「正点原子NANO STM32开发板资料连载」第十章 外部中断实验...
- mysql必知必会看完看什么_《MySQL必知必会》读书笔记
- php判断一个数是否是回文数,每周一道算法题001:回文数
- 【 Vivado 】输入延迟约束(Constraining Input Delay)