QT中发送结构体占用字节相关问题

这篇具有很好参考价值的文章主要介绍了QT中发送结构体占用字节相关问题。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

最近通过上位机发送数据的时候,针对收到的数据突然多出几个bit产生了疑问。用sizeof来看占据的字节大小,发现和实际应该发送的不对。后面查阅了相关资料,理解了这一部分原因,这里做一个记录。


1. 结构体大小问题

struct EDWINWZY
    {
        uint64_t A=500;
        struct Test {
            uint16_t B;
            uint16_t C;
        } test;
    }edwinwzy;

错误想法:结构体大小8+2+2=12个字节
原因:计算结构体大小时需要考虑其内存布局,结构体在内存中存放是按单元存放的,每个单元多大取决于结构体中最大基本类型的大小。A为uint64_t类型即64bit,占8字节,这个没错。B和C都是uint16_t占2字节,也没错。但是B+C=32bit < 64bit(最大基本类型),所以实际上结构体占用的是两个单元大小,即2*8=16字节。

那么拓展一下,我sizeof(edwinwzy),得到的应该就是16,但是如果我对edwinwzy结构体对象的test进行sizeof呢?得到的是结果是4,这是因为用sizeof的时候,针对的是结构体Test,这个结构体里面的最大基本类型是uint16_t,又因为BC是同类型,他们都占满了结构体Test的单元,所以才为4。


2. 添加位域后的结构体大小

struct EDWINWZY
    {
        uint64_t A=500;
        struct Test{
            uint16_t B:1;
            uint16_t C:1;
            uint16_t D:1;
            uint16_t E:1;
            uint16_t F:1;
        } test;
    }edwinwzy;

错误想法:结构体大小所占bit位:64+1+1+1+1+1=69位,69位就是9个字节。
原因:和问题一相同,也是和结构体的内存布局有关,这个结构体内最大基本类型的大小也是uint64_t,占8字节。
所以这里EDWINWZY结构体的大小其实也是16字节。

那同样的,对Test结构体使用sizeof。
错误想法:因为使用了位域,所以结构体里面只用了5位,应该是占用1字节。
原因:结构体Test内最大基本类型的大小是uint16_t,占2字节。所以结构体内存储单元是2字节。这里虽然使用了位域,只占了5位,但是结构体Test的存储单元的长度是2字节,所以这里sizeof(Test)还是2字节,即uint16_t的长度。


3.发送数据多出几个bit

对于上面问题2,我实际的数据可能只有64+5=69位,但是我结构体大小要占用的是128位(uint64_t*2),后面缺了59位都是用0补全。
因此这里接收到的数据就会多出很多个bit位为0的情况。

总结

这个问题第一次碰到,之前学C语言相关的时候并没有考虑到内存分配的问题,对内存具体没有过于深究,这次遇到了就好好解决一下。文章来源地址https://www.toymoban.com/news/detail-550190.html

到了这里,关于QT中发送结构体占用字节相关问题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 结构体占用内存大小如何确定?-->结构体字节对齐 | C语言

    目录 一、什么是结构体 二、为什么需要结构体 三、结构体的字节对齐 3.1、示例1 3.2、示例2 3.3、示例3  3.4、示例4 3.5、示例5 四、结构体字节对齐总结         结构体是将不同类型的数据按照一定的功能需 求进行整体封装,封装的数据类型与大小均可以由用户指定。 结

    2024年01月17日
    浏览(46)
  • QT Creator上位机学习(三)QString及其相关控件介绍

    QSting类,用于处理字符串,进行字符串和数字之间的转化 转换函数: 1.数字转字符串 其中setNum() 函数和number()函数使用了多个重载定义,可以处理各种类型的整数和浮点数,处理整数的时候还可以指定进制。 例如:数据转化为指定进制的字符串 2.字符串转数字 转换为整数:

    2024年02月11日
    浏览(35)
  • ubuntu20安装网络调试助手遇到缺少qt4相关库的问题

    最近需要做套接字通讯的工作,最好是有一个网络调试软件能够接受或者发送套接字,测试代码能够正常通讯。windows下有很多,但是linux下比较少,使用广泛的是下面这一款。 首先从网盘(链接: https://pan.baidu.com/s/1Zo-M9VUNp977xvYSMakv6A?pwd=Nv24)下载软件,或者搜索 ubuntu mNetAssi

    2024年01月25日
    浏览(52)
  • 【Qt 学习笔记】Qt 开发环境的搭建 | Qt 安装教程

    博客主页:Duck Bro 博客主页 系列专栏:Qt 专栏 关注博主,后期持续更新系列文章 如果有错误感谢请大家批评指出,及时修改 感谢大家点赞👍收藏⭐评论✍ 文章编号:Qt 学习笔记 / 02 1. 安装包下载(网盘链接) 链接:https://pan.baidu.com/s/1t3jbYcFYFuJIfe0hPmeDmQ?pwd=duck 提取码:du

    2024年04月26日
    浏览(86)
  • QT笔记——QT类反射机制简单学习

    学习 QT的 类反射机制 使用Qt 反射机制的条件 1.需要继承自QObject 类 或者 它的 派生类 ,并需要在类中加入Q_OBJECT 宏 2.注册成员函数:若希望普通成员函数能够被反射,需要在函数声明之前加入Q_INVOKABLE 宏。 3.注册成员变量:若希望成员变量能被反射,需要使用Q_PROPERTY 宏。

    2024年02月09日
    浏览(120)
  • QT学习笔记-QT安装oracle oci驱动

    在使用QT开发应用的过程中,往往会把应用使用过程中产生的数据放入数据库进行统一存储,因此通过QT实现数据库的访问可以说是必须的一个知识点,其实QT访问数据库的语法及相关类和方法的使用并不复杂,但是对于使用QT的新人来说往往会开在数据库驱动加载的地方,比

    2024年02月12日
    浏览(52)
  • Qt学习笔记5---如何在Qt中添加资源文件

              前言: 在我们给Qt加上图片的时候,可以用本地资源添加的方式,但是此方法代码用的只能是本地资源,不好共享。那么我们可以把资源文件添加在Qt中,这样就不会出现这种问题啦! 第一步:在本地复制你想用的资源文件,点开项目的“在Explorer中显示”,粘贴

    2024年02月16日
    浏览(42)
  • QT字节数组类QByteArray

    字节数组类以 ‘\\0’结尾,索引的下标从0开始。 第一次调用fill函数,不指定size参数,按照之前的长度,跟新值 第二次调用fill函数,指定size参数,重新调整字节数组的长度,并更新值 访问QByteArray类对象的某个元素有4种方式: [] at() data[] constData[] 其中,[]和data[]可读可写,

    2024年02月16日
    浏览(60)
  • QT学习笔记(持续更新)

    1.自定义信号: 写在signals下,void,需要声明,不需要实现,可以有参数,可重载。 2.槽: 写在public下,void,需要声明,需要实现,可有参数,可发生重载。 3.断开信号: disconnect 4.emit: 使用emit发送信号 5.示例关键代码如下: 1.widget.cpp 2.widget.h 3.student.cpp 4.teacher.h和st

    2023年04月26日
    浏览(40)
  • QT笔记——QProcess学习

    我们常常想通过某一个类,来启动一个外部进程 本文将讲解如何通过QProcess来进行启动外部进程 一:了解QProcess QProcess是Qt框架提供的一个类,用于在应用程序中执行外部进程。它提供了一系列函数来启动、控制和与外部进程进行交互 1.启动进程的方式: (1.1)分离式:外部程序

    2024年02月12日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包