为了避免混淆,做如下规定,以下代码若不加特殊说明都运行于32位平台,结构体的默认对齐值是8,各数据类型所占字节数分别为

char占一个字节

int占四个字节

double占八个字节。

两个例子

请问下面的结构体大小是多少?

struct Test { char c ; int i ; };

这个呢?

struct Test1 { int i ; double d ; char c ; };

在公布答案之前先看一下对齐的规则。

对齐规则

一般来说,结构体的对齐规则是先按数据类型自身进行对齐,然后再按整个结构体进行对齐,对齐值必须是2的幂,比如1,2, 4, 8, 16。如果一个类型按n字节对齐,那么该类型的变量起始地址必须是n的倍数。比如int按四字节对齐,那么int类型的变量起始地址一定是4的倍数,比如0x0012ff60,0x0012ff48等。

数据自身的对齐

数据自身的对齐值通常就是数据类型所占的空间大小,比如int类型占四个字节,那么它的对齐值就是4

整个结构体的对齐

整个结构体的对齐值一般是结构体中最大数据类型所占的空间,比如下面这个结构体的对齐值就是8,因为double类型占8个字节。

struct Test2 { int i ; double d ; };

例子答案

有了上面的基础,再回过头去看看一开始的两个例子

先看结构体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做一点改动

struct Test1 { char c ; int i ; double d ; };

这时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++结构体四字节数据对齐相关推荐

  1. C语言基础 - 结构体类型字节对齐总结

    一.什么是字节对齐 在计算机中,内存空间是按照字节(1B = 8 bit)划分的,每一个字节都有一个编号,这就是字节的地址.理论上可以从任意起始地址访问任意数据类型的变量,但在实际使用中,访问特定数据 ...

  2. 结构体struct的自然对齐问题(经典)

    结构体struct的自然对齐问题下面的机构体 struct A {     char c;     int i;     char cc; }; 它的sizeof()是多少呢? 如果是紧凑对齐的话,当 ...

  3. C语言结构体的大小 — — 内存对齐和位域

    C语言结构体对齐 C语言结构体对齐也是老生常谈的话题了.基本上是面试题的必考题.内容虽然很基础,但一不小心就会弄错.写出一个struct,然后sizeof,你会不会经常对结果感到奇怪?sizeof的结 ...

  4. c语言结构体变量所占字节计算,【C语言】结构体占用字节数及存储与空间分配...

    我们都知道在数据类型中,char类型占1个字节,short占2个字节,int占4个字节,long占8个字节等等. 在计算结构体大小时需要考虑其内存布局,结构体在内存中存放是按单元存放的,每个单元多大取 ...

  5. 1-3 MATLAB符号变量的使用、符号变量转为匿名函数、向量值匿名函数、符号变量转为向量值函数、结构体批量提取数据

    1-3 MATLAB符号变量的使用.符号变量转为匿名函数.向量值匿名函数.符号变量转为向量值函数.结构体批量提取数据 文章目录 1-3 MATLAB符号变量的使用.符号变量转为匿名函数.向量值匿名函数 ...

  6. c语言怎么往结构体中传数据,怎么把文件数据写入结构体 c语言 怎么将结构体写入文件...

    怎么把结构体的数据写到文件中 C语言把一个结构体数组写入文件分三步: 以二进制写方式(wb)打开文件 调用写入函数fwrite()将结构体数据写入文件 关闭文件指针 相应的,读文件也要与之匹配: 以二 ...

  7. C#:钩子、委托、匿名、事件、结构体转字节数组、多线程操纵控件、UDP

    事件 C#事件分为几个步骤: 定义事件 定义处理函数 为事件添加处理函数 激活事件 事件被激活后自动调用处理函数. public event messagehandleer shenzhijiangl ...

  8. 转 结构体中字节对齐问题(转载)

    struct MyStruct { double dda1; char dda; int type }; 对结构MyStruct采用sizeof会出现什么结果呢?sizeof(MyStruct)为多少 ...

  9. c# 结构体 4字节对齐_【专题4:平时遇到的问题】 之 【3.由结构体字节对齐引发的通信故障】...

    希望本是无所谓有,无所谓无的,这正如脚下的路,其实地上本没有路,走的人多了,也便成了路....原创不易,文章会持续更新,感谢您的关注 1.问题由来 MCU给上位机发送的一帧数据中,总是多一个字节,调试 ...

最新文章

  1. C#简单操作MongoDB
  2. OpenCV使用VideoWriter和VideoCapture的实例(附完整代码)
  3. iscsi介绍及iscsi target配置
  4. try{}里有一个 return 语句,那么紧跟在这个 try 后的 finally {}里的 code 会 不会被执行,什么时候被执行,在 return 前还是后?...
  5. 【渝粤教育】 国家开放大学2020年春季 1260软件工程 参考试题
  6. Linux 环境变量PATH设置和查看etc/profile和bashrc的区别
  7. webservice调用天气服务
  8. box-sizing属性
  9. 转:神奇的Fastcgi_Finish_Request
  10. C#2.0 泛型初探 (特性一览)
  11. linux motion 分辨率,gtf 来调整Linux系统中分辩率问题分享
  12. grid安装前检查报PRVE-0426:/dev/shm less than the require
  13. 蚂蚁如果上市成功,价格崩盘是必然的
  14. 一款比较好看的javascript轮播图代码
  15. 机器学习与物理科学(四)(Machine learning and the physical sciences)
  16. Wed Sep 16 2020 00:00:00 GMT+0800 (中国标准时间)时间转换为mysql date类型
  17. worldpress或zblog安装时建立数据库连接时出错
  18. Are you trying to connect to a TLS-enabled daemon without TLS?
  19. 人生励志语录 排比句
  20. Uncaught SyntaxError: Unexpected token < in JSON at position 0 at JSON.parse (<anonymous>)

热门文章

  1. 高压包输出信号经过整流后形成直流电流
  2. 2021年春季学期-信号与系统-第十三次作业参考答案-第二小题
  3. python如何自定义模块_python自定义模块和开源模块使用方法
  4. 苹果自带相册打马赛克_老王被绿?iOS 13惊现漏洞,马赛克去除
  5. html中的js点击ipunt后加一,iphone 端 ipunt输入框光标偏移
  6. oracle链接字符串java,java连Oracle连接字符串写法
  7. hal库开启中断关中断_「正点原子NANO STM32开发板资料连载」第十章 外部中断实验...
  8. mysql必知必会看完看什么_《MySQL必知必会》读书笔记
  9. php判断一个数是否是回文数,每周一道算法题001:回文数
  10. 【 Vivado 】输入延迟约束(Constraining Input Delay)