小目标检测(4)——代码学习C++复习

news/2025/1/11 4:22:17/

文章目录

    • 引言
    • 正文
      • typedef struct __msgqueue msgqueue_t;
      • void *head和void **get_head
      • 并发编程中的阻塞模式和非阻塞模式
    • 总结
    • 引用

引言

  • 之前很少用c++,最多就用来进行刷题,并未接触过工程方面的应用。现在因为项目原因,又一次接触了工程上面的编程方式,发现很多东西都不记得了,所以需要复习一下。
  • 最致命的是,之前很多库没用过,你给我参考文档,我就能搞明白,但是对于指针这块,chatGPT给我解释了功能,我还是解释不了这个指针的用法,很难受。

正文

  • 这部分主要是围绕我在编程过程中,遇到的不同的符号以及操作展开的,并没有具体的主线。

typedef struct __msgqueue msgqueue_t;

  • 这个在头文件里面,专门定义了一个结构体__msgqueue,然后他的别名定义为msgqueue_t.具体如下
typedef struct __msgqueue msgqueue_t;

做了两件事情:

  • 它声明了一个名为__msgqueue的结构体。在这个阶段,结构体的具体内容还没有定义,所以它通常被称为不完整类型(incomplete type)。
  • 它为这个结构体定义了一个别名msgqueue_t,所以你可以使用这个别名来引用结构体,而不需要使用struct关键字。
  • 通常,这样的声明会与结构体的实际定义一起使用,如下所示:
typedef struct __msgqueue {int field1;double field2;// 其他成员
} msgqueue_t;
  • 这样,你就可以使用msgqueue_t来引用这个结构体,而不需要使用struct __msgqueue。

void *head和void **get_head

  • void *是通用类型指针,可以指向任何类型的对象

    • 由于没有类型信息,在使用之前,通常需要将之转换为正确的类型
    • head是指向队列头节点的指针
  • void **get_head;是指向void *的指针,他的值是另外一个void *的地址,*get_head是指向一个指向头节点的void *指针。

    • 通常用于指针的数组或链表等数据结构,每一个元素都是一个void *指针
  • 具体使用如下

  • 使用void *之前,必须要知道实际指向的数据类型,并在访问之前进行类型转换

// 这里是假设head2是一个指向整数的void*
int* pInt = static_cast<int*>(head2);
int value = *pInt;// get_head是一个保存head*对象的数组
void* pItem = *get_head; // 获取第一个元素
int* pInt = static_cast<int*>(pItem); // 如果知道它是一个整数
int value = *pInt;

并发编程中的阻塞模式和非阻塞模式

  • 阻塞模式

    • 描述
      • 生产者往满的队列中放消息时,会陷入阻塞,直到有一个非满的队列
      • 消费者从空的队列中取消息时,会陷入阻塞,知道有一个非空的队列
    • 特点
      • 更有效利用系统资源,没有可用的资源时,对应的线程会挂起,减少无用的轮询
  • 非阻塞模式

    • 描述
      • 生产者往满的队列中放消息时,会返回一个错误值,然后执行别的任务
      • 消费者从空的队列中取消息时,会返回一个错误值,然后执行别的任务
    • 特点
      • 增加系统的响应性和灵活性,使得资源在无法立即获得时,能够去执行别的人物
  • 提供原因

    • 提供阻塞和非阻塞模式的选择可以让这个消息队列更灵活地适应不同的使用场景和需求。

    • 在某些情况下,消费者可能希望等待新消息的到来,而不是立即失败。这种情况下,阻塞模式可能更合适。

    • 在其他情况下,消费者可能希望在没有新消息时立即执行其他任务。这种情况下,非阻塞模式可能更合适。

总结

  • 这里很多东西都很细致,都是第一次接触到,学到很多,多做工程,多看别人的代码, 还是对自己的代码能力有提高的。

引用

  • chatGPT总结,个人消化

http://www.ppmy.cn/news/1003895.html

相关文章

2023,谁在引领实时互动进入高清时代?

实践是检验真理的唯一标准&#xff0c;技术是行业进步的核心动能。在实时互动的新时代里&#xff0c;不断进化的声网已然完成自证。 作者|斗斗 出品|产业家 “一个医疗行业的客户&#xff0c;曾向我们提出一个需求&#xff0c;希望在120急救场景下&#xff0c;可以远程看清…

干系人管理 论文要点

干系人管理 10.干系人管理 过程 输入 工具 输出 要点 识别干系人 项目章程项目建议书&#xff0c;可研报告&#xff0c;评估报告沟通计划干系人参与计划&#xff08;规划干系人参与&#xff09;需求文件 问卷和调查文件分析干系人分析权利利益方格干系人立方体凸显模型 …

stm32与上位机电脑间最快的通信方式是什么?

对于小型多关节机械臂的控制电路设计&#xff0c;选择合适的通信方式可以提高MCU与上位机之间的实时性。以下是一些在STM32上常用的通信方式&#xff0c;你可以根据你的具体需求选择适合的&#xff1a; 串口通信&#xff08;UART&#xff09;&#xff1a;串口通信是一种常见的…

Java面向对象之toString()方法

toString()方法 toString()方法在Object类中定义&#xff0c;其返回值是String类型&#xff0c;返回类名和它的引用地址。在进行String与其它类型数据的连接操作时&#xff0c;自动调用toString()方法。 Date nownew Date(); System.out.println(“now”now); 相当于 System.…

基于开源模型搭建实时人脸识别系统(三):人脸关键点、对齐模型概览与模型选型

续 基于开源模型搭建实时人脸识别系统&#xff08;二&#xff09;&#xff1a;人脸检测概览与模型选型_CodingInCV的博客-CSDN博客 摘要 人脸对齐&#xff08;face alignment&#xff09;或者人脸关键点&#xff08;face alignment&#xff09;是定位人脸上的关键点&#xff…

使用socket实现UDP版的回显服务器

文章目录 1. Socket简介2. DatagramSocket3. DatagramPacket4. InetSocketAddress5. 实现UDP版的回显服务器 1. Socket简介 Socket&#xff08;Java套接字&#xff09;是Java编程语言提供的一组类和接口&#xff0c;用于实现网络通信。它基于Socket编程接口&#xff0c;提供了…

Vue3_03_setup函数

1.理解&#xff1a;Vue3.0 中的一个新的配置项&#xff0c;值为一个函数。 2.setup是所有组合式 API 表演的舞台。 3.组件中所用到的&#xff1a;数据、方法等等&#xff0c;均要配置在setup中。 4.setup函数的两种返回值&#xff1a; 若返回一个对象&#xff0c;则对象中的…

【大数据】Flink 从入门到实践(一):初步介绍

Flink 从入门到实践&#xff08;一&#xff09;&#xff1a;初步介绍 Apache Flink 是一个框架和分布式处理引擎&#xff0c;用于在 无边界 和 有边界 数据流上进行 有状态 的计算。Flink 能在所有常见集群环境中运行&#xff0c;并能以内存速度和任意规模进行计算。 1.架构 1…