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

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

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

如以下定义的结构体:

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

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

9c08d29e093a729c2e1f359f35c7936f.png

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

std::cout<

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

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

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

ce48be9bdf0394d4ddcecf13089af4d2.png

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

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

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

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

b0f1209a40fdac2b3384a205f1790710.png

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

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

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

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

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

std::cout<
4eea2a046186ddbae528937576428bdd.png

基本的规则是:

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

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

-End-

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/503837.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

oracle to char trim,to_char前面多出空格

to_char前面多出空格用to_char对数字时前面会多出一个空格。SQL> select to_char(10,00) from dual;TO_---10 --前面有一个空格&#xff0c;这是一个正数的符号位SQL> select length(to_char(10,00)) from dual;LENGTH(TO_CHAR(10,00))------------------------3 …

lisp正负调换_lisp中如何把符号转换为字符串

满意答案rantian20022018.05.29采纳率&#xff1a;47% 等级&#xff1a;12已帮助&#xff1a;12730人1&#xff0c;算术运算 - * / ~ 1 1-abs atan cos exp expt fix floatgcd log logand logior lsh max minminusp rem sin sqrt zerop2&#xff0c;字符串处理strcase strca…

python windows开发_windows 下 python 开发是一种什么样的体验?

只知道如果想用的包没编译好&#xff08;源码状态&#xff09;&#xff0c;你在win下&#xff0c;能折腾很久&#xff0c;各种奇葩报错&#xff0c;在linux下就好多了 补充一下: 我是用的是python2.7,微软给了官方的针对2.7的编译环境: Visual C Compiler for Python 2.7 根据前…

linux 找不到php命令,bash scp:未找到命令的解决方法

scp命令用于通过ssh在两台服务器之间传输文件。大多数scp用户在系统中已经可以使用scp命令&#xff0c;但它仍然显示“bash:scp:command not found”。因此注意&#xff0c;scp命令必须在本地和远程系统上都可用才可以避免这个问题。安装SCP命令包scp命令来自Red Hat系统上的op…

vue移动端项目怎么生成apk_vue-cli或vue项目利用HBuilder打包成移动端app操作

一、测试项目是否可以正确运行 指令:npm run dev1、首先我们先建立一个vue的项目&#xff0c;本人用的是vue-cli随便建立的&#xff0c;然后运行项目二、修改路径 (assetsPublicPath: ‘./)1、 打开我们config中的js文件&#xff0c;修改assetsPublicPath的路径为"./"…

python字典怎么添加值_python字典中如何添加键值对

添加键值对 首先定义一个空字典 1 >>> dic{} 直接对字典中不存在的key进行赋值来添加 1 2 3 >>> dic[name]zhangsan >>> dic {name: zhangsan} 如果key或value都是变量也可以用这种方法 1 2 3 4 5 >>> keyage >>> value30 >&g…

Redis数据库——键过期时间

一.设置键的生存时间或者过期时间 我们可以在Redis客户端输入命令&#xff0c;可以以秒或者毫秒精度为数据库中的某个键设置生存时间&#xff0c;在指定秒数或者毫秒数之后&#xff0c;服务器会自动删除生存时间为0的键。 1.1 设置过期时间 Redis有四个不同的命令可以用于设置键…

linux 系统配额管理功能,Linux磁盘配额管理

前言&#xff1a;磁盘配额是一种磁盘空间的管理机制&#xff0c;使用磁盘配额可限制用户或组在某个特定文件系统中所能使用的最大空间。Linux系统是多用户任务操作系统&#xff0c;在使用系统时&#xff0c;会出现多用户共同使用一个磁盘的情况&#xff0c;如果其中少数几个用户…

python中的with open读取表格文件_python 使用 with open() as 读写文件

读文件: 要以读文件的模式打开一个文件对象&#xff0c;使用Python内置的open()函数&#xff0c;传入文件名和标示符&#xff1a; >>> f open(E:\python\python\test.txt, r) 标示符r表示读&#xff0c;这样&#xff0c;我们就成功地打开了一个文件。 如果文件不存在…

实用必备xp框架模块_Xposed框架安装、使用以及插件开发

Xposed框架&#xff1a;是一款可以在不修改APK的情况下影响程序运行&#xff08;修改系统&#xff09;的框架服务&#xff0c;基于它可以制作出许多功能强大的模块&#xff0c;且在功能不冲突的情况下同时运作。对原生Launcher替换图标等应用或功能均基于此框架。1、安装xposed…

3D动作绑定_3D动漫制作软件,你知道几个?

最近小编收到很多私信&#xff0c;都是问小编3D动画是靠什么软件制作而成的&#xff1f;小编经过长时间的查询&#xff0c;今天就给大家来讲一讲3D动画到底是靠什么软件制作而成的。首先&#xff0c;先给大家来讲讲3D动画在国内的制作。动画制作是个庞大的工业流程&#xff0c;…

plc单片机组态软件php_STC8单片机扩展WiFi通信实现功能与组态王组态软件详细组态...

STC8单片机扩展WiFi通信模块和组态王组态软件实现Modbus TCP以太网通信一、通信实现功能&#xff1a;1、Modbus TCP Client&#xff1a;组态王组态软件2、Modbus TCP Server&#xff1a;STC单片机WiFi通信模块3、组态王组态软件对单片机数字量输入、晶体管输出、模拟量输入、模…

linux set权限,Linux 特殊权限set_uid(示例代码)

特殊权限set_uid默认情况下 , 在新安装好的Linux系统下 , 仅有一个命令是拥有set_uid特殊权限的 .拥有s权限的命令(文件) : 为了确保非所有者用户 , 在使用该命令时,临时拥有所有者的身份 ; 给一个文件设置set_uid特殊权限,前提是该文件是一个可执行的二进制文件(一般都是给命令…

python中如何编写代码输入多个数据并把它们放在一个列表中去_10分钟学习函数式Python...

在这篇10分钟的文章中&#xff0c;您将学习Python中的函数式范型。您还将学习列表推导式。目录函数式范式Python的map函数是如何运行的Python中的lambda表达式Python中的reduce函数filter函数Python中的高阶函数带有函数的部分应用函数编程不是Python化列表推导式任何可迭代对象…

python 切片器_PowerBI-将日期显示为星期作为切片器

表&#xff1a;表有字段From_Date&#xff0c;Week_Code (1-7)需求&#xff1a;添加切片器WEEKDAY显示值Monday&#xff0c;Sunday&#xff0c;Monday&#xff0c;Tuesday&#xff0c;Wednesday&#xff0c;Thursday&#xff0c;Friday&#xff0c;Saturday。选择Monday时&…

linux 串口格式化输出字符串,如何把电压这个浮点值转字符串输出到串口

问题一&#xff1a;如何把电压这个浮点值输出到串口屏&#xff1f;要解决这个问题&#xff0c;要使用C语言的sprintf这个语句&#xff0c;具体语句的详细内容可以自行百度下&#xff0c;这里仅提供简单使用方法&#xff1a;sprintf是需要stdio.h来声明的&#xff0c;因此需要在…

c++ mqtt客户端_MQTT详解及百度物接入连接手机测试(含源码) 秦子帅

MQTT简介MQTT定义MQTT(Message Queuing Telemetry Transport&#xff0c;消息队列遥测传输)是IBM开发的一个即时通讯协议&#xff0c;有可能成为物联网的重要组成部分。该协议支持所有平台&#xff0c;几乎可以把所有联网物品和外部连接起来&#xff0c;被用来当做传感器和制动…

qgraphicsitem 复制副本_删除/删除/替换QGraphicsTextItem中的选定文本

不工作QTextCursor::removeSelectedText()&#xff1f;在下面的例子中&#xff0c;我们在一开始的文字QGraphics Text Item 1&#xff0c;但正如你所看到的&#xff0c;我们可以得到QTextDocument&#xff0c;也是QTextCursor该文档&#xff0c;并插入一些话。之后&#xff0c;…

antix linux安装教程,antiX 19.1 发布,轻量级的桌面Linux发行版

antiX是一种轻量级的桌面Linux发行版&#xff0c;以IceWM作为默认窗口管理器&#xff0c;已升级到版本19.1。尽管主要是一个错误修复版本&#xff0c;但新版本还将IceWM更新到版本1.6.3&#xff1a;提供了antiX-19.1错误修复/升级ISO映像。所有新ISO映像都是antiX 19 SysVInit系…

jira使用教程pdf_jira项目管理系统使用指南.pdf

jira项目管理系统使用指南.pdf 目录1 项目管理系统简介 . 错 误 未定义书签。1.1 系统涉及的角色 1 1.1.1 管理人员 1 1.1.2 项目管理者 1 1.1.3 开发人员 1 1.1.4 测试人员 1 1.1.5 其他人员 1 2 JIRA 的基本概念 . 2 2.1 什么是问题 . 2 2.1.1 问题类型 3 2.1.2 优先级 . 3 2…