c 定义结构体时提示应输入声明_C++|了解结构体的内存对齐(成员声明的顺序影响占用空间大小)...
我们使用的电子计算机绝大部分都是冯·诺依曼结构的机器,遵循“存储程序”的概念。数据处理以存储为前提,在编程中数据如何“存得进去,取得出来”,并且符合空间、时间效率的要求,在考虑数据结构和算法时,都要有清晰的内存映像的图景。
你可以想像在定义一个结构体时,就是在构建一块内存空间的架构。当定义结构体变量时,就会实际分配内存空间,这块内存空间的首地址就是结构体变量的名称,各成员变量名对应各小块空间的首地址。访问各成员变量使用的点号,就如同是大块空间的地址到成员空间的映射或偏移。
如以下定义的结构体:
#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++|了解结构体的内存对齐(成员声明的顺序影响占用空间大小)...相关推荐
- c 定义结构体时提示应输入声明_C语言结构体的坑很多,这6大方法千万要记住!...
本文福利在文末! C语言可谓是编程界的传奇语言,历经几十年,依然排名前列. 本文主要说的是C语言中的结构体,结构体是C语言中重要的一部分内容,也是C语言中常用的一种数据结构. 一.关于结构体在C语言中 ...
- c 定义结构体时提示应输入声明_C|语法的合理性理解和分析
试想如果你作为C语言或C语言编译器的的设计者,肯定不会任意设置语法规则,除了考虑不能有歧义以外,还会考虑其合理性. 1 效率是第一位的,安全处于次要位置 了解C语言"效率第一.安全次之&qu ...
- Win10共享文件时提示需要输入网络凭据怎么办?
Win10共享文件时提示需要输入网络凭据怎么办?-系统部落 时间:2022-01-17 13:49:26 作者:nana 来源:系统部落 近期有部分Win10用户反映在共享文件时,出现了提示需要输入网 ...
- cin.ignore在Vs2019中报错提示应输入表示符的解决方案
在vs2019中使用cin.ignore(std::numeric_limits::max(), '\n'); 编译器提示 max() 应输入标识符 修改成: cin.ignore((std::num ...
- JAVA编写提示用户输入投资额_java(计算银行存款总额(要求输入错误时,提示重新输入))...
[任务一]:编写一个简单 Java 程序,计算银行年存款的本息. 要求:程序运行后要求用户输入存款本金.年利率和存款年限,最后程序计算并输出相应年限后存款的金额.相应 的计算公式为:存款总额=本金 * ...
- c++ new一个结构体_C语言结构体,又一个纸老虎,纯干货讲解(附代码)
来源:网络,排版整理:晓宇 微信公众号:芯片之家(ID:chiphome-dy)结构体的定义结构体(struct)是由一系列具有相同类型或不同类型的数据构成的数据集合,也叫结构.结构体和其他类型基础数 ...
- uedit上传视频时提示输入的视频地址有误,请检查后再试
问题描述: 利用百度的uedit上传视频时提示:输入的视频地址有误,请检查后再试 注意: 本问只解决标题所示错误,前提是你没有别的问题,视频可以正常上传,如果视频上传不能预览,或者上传成功后不能播放, ...
- 内存对齐的原理,作用,例子以及一些规划(中英文说明,适用sizeof结构体) ...
目录 题记 一 内存读取粒度 Memory access granularity 从内存的角度解释内存对齐的原理 队列原理 Alignment fundamentals Laz ...
- autoCAD 提示用户输入
提示用户输入 Editor 对象是 Document 对象的子对象,定义了用户输入方法.用户输入方法在 AutoCAD 命令行中或动态输入工具提示中显示一个提示信息,并且要求输入各种不同类型的值.这种 ...
最新文章
- VS.net 2005 试用(1)
- git status清空_Git常见命令和遇到问题的解决办法
- Shell与ShellScript
- TF之TFSlim:利用经典VGG16模型(InceptionV3)在ImageNet数据集基础上训练自己的五个图像类别数据集的训练过程记录
- ArcMap中的名称冲突问题
- C++中各种智能指针的实现及弊端(五)
- c 语言 while break,26 C 语言中的break和continue - C 语言基础教程
- UI体系的本质是结构化存在
- 重写__repr__与__str__函数
- kafka使用_Kafka介绍与使用
- 下拉框value ,selectedIndex
- PCL中3D点云特征描述与提取(一)
- TD-SCDMA正传(1)
- java 泰国_游记:泰国之旅
- easyExcel下载Excel
- VMware网络NAT模式无法连接解决方法
- 【web-攻击用户】(9.4)跨域捕获数据——通过注入HTML捕获数据、注入CSS捕获数据、JavaScript劫持
- 一个硅谷实习生竟是顶级黑客?网络安全风险多!
- 国外免费(开放获取)学术资源大全
- python筛选时间范围_使用日期范围筛选模型
热门文章
- java-图像的几何变换
- 北理计算机教案,北理工版三年级信息技术教案重点.docx
- 公交换乘系统c语言,公交换乘的简单实现(源码)
- 分区助手扩大c盘后自动修复_磁盘分区工具,这个好用;无论调整C盘还是系统迁移...
- centos双系统只有linux,Centos添加Windows/Centos双系统启动
- android webview fragment,android studio中Fragment使用webview返回上一頁的問題
- mysql 移植ucos_基于STM32F767的UCOSIII移植学习
- matlab保存colormap失败
- windows+caffe下对CIFAR训练
- 《Python 黑科技》10万粉丝头像千图成像(撩对象)