我们使用的电子计算机绝大部分都是冯·诺依曼结构的机器,遵循“存储程序”的概念。数据处理以存储为前提,在编程中数据如何“存得进去,取得出来”,并且符合空间、时间效率的要求,在考虑数据结构和算法时,都要有清晰的内存映像的图景。

你可以想像在定义一个结构体时,就是在构建一块内存空间的架构。当定义结构体变量时,就会实际分配内存空间,这块内存空间的首地址就是结构体变量的名称,各成员变量名对应各小块空间的首地址。访问各成员变量使用的点号,就如同是大块空间的地址到成员空间的映射或偏移。

如以下定义的结构体:

#includestruct Readout {char hour;int value;char seq;}testSize;void main(){std::cout<

你可能会想到以下的内存映像图景(以下都是假设32位,int类型占用4个字节长度的机器):

可能会认为以下代码的输出应该是6(各成员大小的和)。

std::cout<

但实际的输出却是12。这就是结构体的内存对齐,编译器会自动对齐结构体数据成员以提高运行效率。

结构体的字节对齐是指编译器在为结构体变量分配内存时,保证下一个成员的偏移量为成员类型的整数倍。因此,对于一些结构体变量来说,其大小并不等于结构体中每一个成员大小的总和。编译器基于效率因素增加一些额外字节以使存储边界对齐。

这样会在内存中留下一些“空洞”而增加了内存空间的占用:

这也就解释了内存空间占用是12而不是6的原因。

您可以通过简单地按大小(首先是最大的成员)对成员排序来最小化浪费的空间。

struct Readout {int value;char hour;char seq;}testSize;void main(){std::cout<

此时的内存占用是8个字节:

也就是说,因为对齐的原因,还是留下了一些内存“空洞”。

如果是以下结构定义,size也是8:struct Readout {char hour;char seq;int value;}testSize;

通过以下语句可以强制地声明结构体内存对齐的长度,如:

#pragma pack(1) //C编译器按n字节对齐。

如果有声明以上语句,则下面语句的输出就是6了:

std::cout<

基本的规则是:

结构体每个成员相对于结构体首地址的偏移量(offset)都是成员大小的整数倍,如有需要,编译器会在成员之间加上填充字节;

结构体的总大小为结构体最宽基本类型成员大小的整数倍,如有需要编译器会在在最末一个成员之后加上填充字节。

-End-

c 定义结构体时提示应输入声明_C++|了解结构体的内存对齐(成员声明的顺序影响占用空间大小)...相关推荐

  1. c 定义结构体时提示应输入声明_C语言结构体的坑很多,这6大方法千万要记住!...

    本文福利在文末! C语言可谓是编程界的传奇语言,历经几十年,依然排名前列. 本文主要说的是C语言中的结构体,结构体是C语言中重要的一部分内容,也是C语言中常用的一种数据结构. 一.关于结构体在C语言中 ...

  2. c 定义结构体时提示应输入声明_C|语法的合理性理解和分析

    试想如果你作为C语言或C语言编译器的的设计者,肯定不会任意设置语法规则,除了考虑不能有歧义以外,还会考虑其合理性. 1 效率是第一位的,安全处于次要位置 了解C语言"效率第一.安全次之&qu ...

  3. Win10共享文件时提示需要输入网络凭据怎么办?

    Win10共享文件时提示需要输入网络凭据怎么办?-系统部落 时间:2022-01-17 13:49:26 作者:nana 来源:系统部落 近期有部分Win10用户反映在共享文件时,出现了提示需要输入网 ...

  4. cin.ignore在Vs2019中报错提示应输入表示符的解决方案

    在vs2019中使用cin.ignore(std::numeric_limits::max(), '\n'); 编译器提示 max() 应输入标识符 修改成: cin.ignore((std::num ...

  5. JAVA编写提示用户输入投资额_java(计算银行存款总额(要求输入错误时,提示重新输入))...

    [任务一]:编写一个简单 Java 程序,计算银行年存款的本息. 要求:程序运行后要求用户输入存款本金.年利率和存款年限,最后程序计算并输出相应年限后存款的金额.相应 的计算公式为:存款总额=本金 * ...

  6. c++ new一个结构体_C语言结构体,又一个纸老虎,纯干货讲解(附代码)

    来源:网络,排版整理:晓宇 微信公众号:芯片之家(ID:chiphome-dy)结构体的定义结构体(struct)是由一系列具有相同类型或不同类型的数据构成的数据集合,也叫结构.结构体和其他类型基础数 ...

  7. uedit上传视频时提示输入的视频地址有误,请检查后再试

    问题描述: 利用百度的uedit上传视频时提示:输入的视频地址有误,请检查后再试 注意: 本问只解决标题所示错误,前提是你没有别的问题,视频可以正常上传,如果视频上传不能预览,或者上传成功后不能播放, ...

  8. 内存对齐的原理,作用,例子以及一些规划(中英文说明,适用sizeof结构体) ...

    目录   题记  一  内存读取粒度   Memory access granularity   从内存的角度解释内存对齐的原理   队列原理 Alignment fundamentals   Laz ...

  9. autoCAD 提示用户输入

    提示用户输入 Editor 对象是 Document 对象的子对象,定义了用户输入方法.用户输入方法在 AutoCAD 命令行中或动态输入工具提示中显示一个提示信息,并且要求输入各种不同类型的值.这种 ...

最新文章

  1. VS.net 2005 试用(1)
  2. git status清空_Git常见命令和遇到问题的解决办法
  3. Shell与ShellScript
  4. TF之TFSlim:利用经典VGG16模型(InceptionV3)在ImageNet数据集基础上训练自己的五个图像类别数据集的训练过程记录
  5. ArcMap中的名称冲突问题
  6. C++中各种智能指针的实现及弊端(五)
  7. c 语言 while break,26 C 语言中的break和continue - C 语言基础教程
  8. UI体系的本质是结构化存在
  9. 重写__repr__与__str__函数
  10. kafka使用_Kafka介绍与使用
  11. 下拉框value ,selectedIndex
  12. PCL中3D点云特征描述与提取(一)
  13. TD-SCDMA正传(1)
  14. java 泰国_游记:泰国之旅
  15. easyExcel下载Excel
  16. VMware网络NAT模式无法连接解决方法
  17. 【web-攻击用户】(9.4)跨域捕获数据——通过注入HTML捕获数据、注入CSS捕获数据、JavaScript劫持
  18. 一个硅谷实习生竟是顶级黑客?网络安全风险多!
  19. 国外免费(开放获取)学术资源大全
  20. python筛选时间范围_使用日期范围筛选模型

热门文章

  1. java-图像的几何变换
  2. 北理计算机教案,北理工版三年级信息技术教案重点.docx
  3. 公交换乘系统c语言,公交换乘的简单实现(源码)
  4. 分区助手扩大c盘后自动修复_磁盘分区工具,这个好用;无论调整C盘还是系统迁移...
  5. centos双系统只有linux,Centos添加Windows/Centos双系统启动
  6. android webview fragment,android studio中Fragment使用webview返回上一頁的問題
  7. mysql 移植ucos_基于STM32F767的UCOSIII移植学习
  8. matlab保存colormap失败
  9. windows+caffe下对CIFAR训练
  10. 《Python 黑科技》10万粉丝头像千图成像(撩对象)