C++高频知识点(二十三)

文章目录

  • 111. 谈谈atomic
    • 1. 什么是原子操作?
    • 2. std::atomic 的基本使用
      • 示例:基本使用
    • 3. 原子操作方法
    • 4. 内存模型与顺序一致性
  • 112. 引用成员变量是否占空间?
    • 1. 引用成员变量的定义
    • 2. 内存占用情况
      • 1. 成员变量的实际占用
      • 2. 类的总大小
      • 代码分析
  • 113. C++中深拷贝和浅拷贝的区别,什么情况用浅拷贝什么情况用深拷贝,实际编码中使用过吗,遇到过什么问题么?
    • 浅拷贝的使用场景:
      • 涉及指针的浅拷贝
    • 深拷贝的使用场景:
    • 实际编码中的问题
    • 如何避免问题
  • 114. 视频帧数据格式转换怎么做?
    • 常见视频帧格式
    • 针对RGB
    • 针对YUV
    • 什么时候需要转换
    • 进行格式转换的方法
      • 1. 手动计算像素转换:
      • 示例代码:YUV420 转 RGB24 (这代码简单了解一下思路即可)
      • 2. 使用现成的图像处理库:
        • OpenCV:
        • FFmpeg:
  • 115. RGB 和 YUV 有什么区别,为什么用 YUV?
    • 为什么要使用YUV?

111. 谈谈atomic

在这里插入图片描述

1. 什么是原子操作?

在这里插入图片描述

2. std::atomic 的基本使用

C++11 引入了 std::atomic 模板类,用于提供对原子类型的支持。std::atomic 可以包装基本类型(如 int、bool、char 等)和指针类型,使其成为原子类型。

示例:基本使用

#include <iostream>
#include <atomic>
#include <thread>
#include <vector>std::atomic<int> counter(0);  // 定义一个原子整型变量void increment(int n) {for (int i = 0; i < n; ++i) {// fetch_add 是 std::atomic 提供的一个成员函数,它会原子地将 counter 增加 1,并返回更新前的值。fetch_add 确保了增加操作是原子的,即在多线程环境中不会出现数据竞争。counter.fetch_add(1);  // 使用 fetch_add 原子地增加计数器// counter = counter + 1;// counter++;}
}int main() {const int numThreads = 10;const int incrementsPerThread = 1000;std::vector<std::thread> threads;// 创建多个线程,每个线程执行 increment 函数for (int i = 0; i < numThreads; ++i) {threads.emplace_back(increment, incrementsPerThread);}// 等待所有线程完成for (auto& t : threads) {t.join();}std::cout << "最终计数器的值是: " << counter << std::endl;  // 输出计数器的最终值return 0;
}

在这里插入图片描述
在这里插入图片描述

3. 原子操作方法

在这里插入图片描述

4. 内存模型与顺序一致性

在这里插入图片描述
在这里插入图片描述

112. 引用成员变量是否占空间?

在 C++ 中,引用成员变量是占用空间的,但其空间占用方式和普通成员变量略有不同。
为了更详细地解释,我们需要先了解一些基本概念:

1. 引用成员变量的定义

引用成员变量是类成员中使用引用类型的变量。例如:

class MyClass {
public:int x;int& ref;MyClass(int& r) : x(0), ref(r) {}  // 引用成员变量的初始化
};

2. 内存占用情况

1. 成员变量的实际占用

在这里插入图片描述

2. 类的总大小

类的总内存大小由类中所有成员变量的大小决定,包括引用成员变量。虽然引用本身不占用额外的内存(其实际内存占用与指针相似),但它会导致类的布局和对齐要求。

#include <iostream>
#include <iomanip>class MyClass {
public:int x;  int& ref;  MyClass(int& r) : x(0), ref(r) {}
};int main() {int a = 10;MyClass obj(a);std::cout << "Size of int: " << sizeof(int) << " bytes" << std::endl;std::cout << "Size of MyClass: " << sizeof(MyClass) << " bytes" << std::endl;std::cout << "Size of reference: " << sizeof(obj.ref) << " bytes" << std::endl;return 0;
}

代码分析

“引用本身不占内存” 是指引用只是一个已存在对象的别名,而不需要额外的内存空间来存储其自身的值
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

113. C++中深拷贝和浅拷贝的区别,什么情况用浅拷贝什么情况用深拷贝,实际编码中使用过吗,遇到过什么问题么?

在C++中,深拷贝和浅拷贝是对象拷贝的两种方式,它们的主要区别在于对指针成员的处理。
在这里插入图片描述
在这里插入图片描述

浅拷贝的使用场景:

浅拷贝适合于对象不涉及动态内存分配或指针成员时,或多个对象可以安全地共享同一块内存的情况。一般来说,浅拷贝多用于内置类型和简单数据类型的复制。

struct Point {int x, y;
};Point p1 = {1, 2};
Point p2 = p1;  // 浅拷贝:只复制成员值  //复制 p1 的成员值到 p2 中,而不是地址
//各位一定要注意:这里是将p1的值复制给了p2 ,但是p1和p2并不是同一个对象。 
//也就是说,你可以将浅拷贝分为两个部分: 一个部分是简单类型的值拷贝,另外一个是含有指针的复制

涉及指针的浅拷贝

浅拷贝通常指的是当对象内部有指针成员时,拷贝对象时只复制了指针的地址,而没有复制指针指向的实际数据。

class ShallowCopyExample {
public:int* data;ShallowCopyExample(int value) {data = new int(value);  // 动态分配内存}~ShallowCopyExample() {delete data;  // 释放内存}
};int main() {ShallowCopyExample obj1(10);ShallowCopyExample obj2 = obj1;  // 浅拷贝,只拷贝指针地址std::cout << obj1.data << std::endl;  // 输出指针的地址std::cout << obj2.data << std::endl;  // 输出相同的地址(共享同一块内存)
}

在这里插入图片描述

深拷贝的使用场景:

在这里插入图片描述

class DeepCopy {
public:int* data;DeepCopy(int value) {data = new int(value);  // 动态分配内存}// 自定义拷贝构造函数,实现深拷贝DeepCopy(const DeepCopy& other) {data = new int(*other.data);  // 分配新内存,并复制内容}// 自定义赋值操作符,实现深拷贝DeepCopy& operator=(const DeepCopy& other) {if (this == &other) return *this;  // 自我赋值检查delete data;  // 释放旧内存data = new int(*other.data);  // 分配新内存并复制内容return *this;}~DeepCopy() {delete data;  // 释放内存}
};int main() {DeepCopy obj1(10);DeepCopy obj2 = obj1;  // 深拷贝:obj1 和 obj2 拥有独立的内存
}

实际编码中的问题

在这里插入图片描述
常见问题示例:

class ShallowCopyExample {
public:int* data;ShallowCopyExample(int value) {data = new int(value);}~ShallowCopyExample() {delete data;  // 释放内存}
};ShallowCopyExample obj1(10);
ShallowCopyExample obj2 = obj1;  // 浅拷贝,obj2和obj1共享同一块内存// 当obj1和obj2销毁时,都会试图释放同一块内存,导致双重释放错误

如何避免问题

在这里插入图片描述

class DeepCopyWithSmartPointer {
public:std::unique_ptr<int> data;DeepCopyWithSmartPointer(int value) : data(std::make_unique<int>(value)) {}
};

114. 视频帧数据格式转换怎么做?

常见视频帧格式

在这里插入图片描述

针对RGB

每个像素信息也都是由不同亮度的RGB信息组合而成。
在这里插入图片描述

如果直接使用RGB信号进行图像信号传输,是无法兼容黑白电视,且占用的宽带成本高。所以将图像信息分成亮度信息和色度信息进行传输,成为了彩色电视传输的主要技术。

针对YUV

一个图像信息分为一个亮度信息和两个色度信息,亮度信息用Y表示,色相和饱和度信息用UV表示,这就是目前主流的YUV颜色空间。
在这里插入图片描述

什么时候需要转换

YUV 转 RGB当视频数据从编码器传递给显示设备时,通常需要从 YUV 转换为 RGB。
RGB 转 YUV在进行视频压缩时,RGB 数据通常需要转换为 YUV 格式。

进行格式转换的方法

1. 手动计算像素转换:

在这里插入图片描述

示例代码:YUV420 转 RGB24 (这代码简单了解一下思路即可)

void YUV420ToRGB24(unsigned char* yuvBuffer, unsigned char* rgbBuffer, int width, int height) {int frameSize = width * height;int uOffset = frameSize;int vOffset = frameSize + frameSize / 4;for (int j = 0; j < height; j++) {for (int i = 0; i < width; i++) {int yIndex = j * width + i;int uIndex = (j / 2) * (width / 2) + (i / 2);int vIndex = (j / 2) * (width / 2) + (i / 2);int Y = yuvBuffer[yIndex];int U = yuvBuffer[uOffset + uIndex] - 128;int V = yuvBuffer[vOffset + vIndex] - 128;int R = Y + 1.402 * V;int G = Y - 0.344136 * U - 0.714136 * V;int B = Y + 1.772 * U;R = R < 0 ? 0 : (R > 255 ? 255 : R);G = G < 0 ? 0 : (G > 255 ? 255 : G);B = B < 0 ? 0 : (B > 255 ? 255 : B);int rgbIndex = yIndex * 3;rgbBuffer[rgbIndex] = (unsigned char)R;rgbBuffer[rgbIndex + 1] = (unsigned char)G;rgbBuffer[rgbIndex + 2] = (unsigned char)B;}}
}

2. 使用现成的图像处理库:

大多数情况下,我们不需要自己编写格式转换的代码,现有的库已经高效地实现了这些功能。

OpenCV:

OpenCV 提供了图像和视频处理的多种工具,其中包括各种格式转换功能。使用 OpenCV,可以简单地完成格式转换,例如从 YUV 转 RGB。

#include <opencv2/opencv.hpp>int main() {cv::Mat yuvFrame; // 假设这是一个 YUV 格式的视频帧cv::Mat rgbFrame;// 将 YUV 格式转换为 RGB 格式cv::cvtColor(yuvFrame, rgbFrame, cv::COLOR_YUV2RGB);// 现在 rgbFrame 中存储的就是 RGB 格式的数据return 0;
}
FFmpeg:

FFmpeg 是一个强大的多媒体处理库,支持各种视频格式的转换。可以通过它的 API 或命令行工具完成视频帧格式转换。

使用 FFmpeg 命令行工具,将 YUV 转换为 RGB:

ffmpeg -i input.yuv -pix_fmt rgb24 output.rgb

115. RGB 和 YUV 有什么区别,为什么用 YUV?

在这里插入图片描述
在这里插入图片描述

为什么要使用YUV?

在这里插入图片描述

之后我会持续更新,如果喜欢我的文章,请记得一键三连哦,点赞关注收藏,你的每一个赞每一份关注每一次收藏都将是我前进路上的无限动力 !!!↖(▔▽▔)↗感谢支持!

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

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

相关文章

云存储的高效安全助手:阿里云国际站 OSS

在这个数据爆炸的时代&#xff0c;数据存储和管理成为了众多企业和个人面临的一大挑战。想象一下&#xff0c;你是一位视频博主&#xff0c;随着粉丝量的增长&#xff0c;视频素材越来越多&#xff0c;电脑硬盘根本装不下&#xff0c;每次找素材都要花费大量时间。又或者你是一…

【线性基】P4301 [CQOI2013] 新Nim游戏|省选-

本文涉及知识点 C贪心 位运算、状态压缩、枚举子集汇总 线性基 P4301 [CQOI2013] 新Nim游戏 题目描述 传统的 Nim 游戏是这样的&#xff1a;有一些火柴堆&#xff0c;每堆都有若干根火柴&#xff08;不同堆的火柴数量可以不同&#xff09;。两个游戏者轮流操作&#xff0c;…

[25-cv-09610]Anderson Design Group 版权维权再出击,12 张涉案图片及近 50 个注册版权需重点排查!

Anderson 版权图案件号&#xff1a;25-cv-09610立案时间&#xff1a;2025年8月13日原告&#xff1a;Anderson Design Group, Inc.代理律所&#xff1a;Keith原告介绍原告是美国的创意设计公司&#xff0c;成立于1993年&#xff0c;简称ADG&#xff0c;一家家族企业&#xff0c;…

Mac下载AOSP源代码

一、前期准备 硬件要求 至少 200GB 可用空间(源码约 100GB,编译产物需额外空间),推荐 SSD。 内存 16GB+,避免同步 / 编译时卡顿。 系统要求 macOS 10.14+(推荐最新版本,兼容性更好) 二、环境配置 AOSP 源码包含大小写不同的文件(如 File.java 和 file.java),而 …

Linux之网络

Linux之网络两个模型应用层协议HTTPS传输层协议UDPTCP可靠性与效率的兼顾面向字节流TCP异常情况底层实现网络层协议IP网段划分子网划分NAT数据链路层协议以太网ARP代理服务器内网穿透五种IO多路复用Reactor模式本文旨在讲解tcp-ip协议原理&#xff0c;并不涉及代码部分&#xf…

MCP(模型上下文协议):是否是 AI 基础设施中缺失的标准?

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

基于粒子群优化算法优化支持向量机的数据回归预测 PSO-SVM

一、作品详细简介 1.1附件文件夹程序代码截图 全部完整源代码&#xff0c;请在个人首页置顶文章查看&#xff1a; 学行库小秘_CSDN博客​编辑https://blog.csdn.net/weixin_47760707?spm1000.2115.3001.5343 1.2各文件夹说明 1.2.1 main.m主函数文件 该代码实现了使用PSO…

版本更新!FairGuard-Mac加固工具已上线!

FairGuard-Mac加固工具1.0.2版本更新日志&#xff1a;■ 支持 AssetBundle 资源加密;■ 支持 Unity global-metadata 文件加密;AssetBundle &#xff0c;是 Unity 提供的一种资源存储压缩包。其中储存了游戏的资源&#xff0c;如图片、模型、纹理、音视频、代码等文件。AssetBu…

【Linux篇章】穿越数据迷雾:HTTPS构筑网络安全的量子级护盾,重塑数字信任帝国!

本篇摘要 本篇文章将从https是什么&#xff0c;为什么需要https角度&#xff0c;基于之前学的http[速戳速通HTTP]认识https&#xff0c;介绍什么是加密等&#xff0c;认识加密的两种方式&#xff1a;对称加密和非对称加密&#xff1b;引出五种不同的通信方加密方式外加渗透证书…

数据库:表和索引结构

表和索引是如何组织和使用的&#xff0c;在很大程度上取决于具体的关系型DBMS&#xff0c;然而它们都依赖于大致相似的结构和原则。索引页和表页表行和索引行都被存储在页中。页的大小一般为4kb&#xff0c;这是一个可以满足大部分需求的大小&#xff0c;也可以是其他大小&…

Java 学习笔记(基础篇5)

1. 综合练习(1) 抽奖public class test10 {public static void main(String[] args) {int[] arr {2,588,888,1000,10000};Random r new Random();for (int i 0; i < arr.length; i) {int randomIndex r.nextInt(arr.length);int temp arr[randomIndex];arr[randomIndex…

P1162 填涂颜色(染色法)

P1162 填涂颜色 - 洛谷 #include <bits/stdc.h> using namespace std; #define ll long long const int N 1e7 10; int n; int a[100][100],b[110][110]; int dx[4]{-1,1,0,0}; int dy[4]{0,0,1,-1}; void dfs(int x,int y) {if(x<0 || x>n1 || y<0 || y>n…

Webrtc在项目中承担的角色

一、简单划分 解决方案层:负责对SDK的对接、操作业务逻辑、UI封装、采集、渲染等,属于基础业务逻辑层 会议SDK层:负责对会议业务逻辑的封装、服务端交互、创会/加会/离会等,属于会议业务逻辑层 mediasoupclient层: 负责对webrtc封装,提供会议层面相关接口,属于webrtc业务…

Servlet上传文件

这是一个Maven项目tomcat版本&#xff1a;9.0.107pom.xml<project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/4.0.0 http://maven.apache.…

cocos creator 3.8 - 精品源码 -《汉中汉:汉字中的字》

cocos creator 3.8 - 精品源码 - 超级文字大师游戏介绍功能介绍免费体验下载开发环境游戏截图免费体验游戏介绍 《汉中汉&#xff1a;汉字中的字》、找汉字&#xff0c;是一款从文字中的笔画找出可以组成新汉字的小游戏。比如&#xff1a;“王”字中的笔画就可以组成&#xff…

手机端的音视频界面或者图片文档界面共享给大屏

手机端的音视频界面或者图片文档界面共享给大屏&#xff0c;可通过无线投屏和有线连接等技术手段实现&#xff0c;以下是具体介绍&#xff1a;无线投屏&#xff1a;AirPlay&#xff1a;这是苹果公司开发的无线共享协议。苹果手机可通过上滑或下拉调出控制中心&#xff0c;点击 …

Linux内存管理系统性总结

Linux内存管理系统性总结 内存管理核心架构图 #mermaid-svg-hKRdgBBYXZTiost8 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-hKRdgBBYXZTiost8 .error-icon{fill:#552222;}#mermaid-svg-hKRdgBBYXZTiost8 .error-t…

MySQL 运算符实战:9 道经典练习题解析

MySQL 运算符实战&#xff1a;9 道经典练习题解析 运算符是 MySQL 查询的 “灵魂”&#xff0c;灵活运用各类运算符能让数据筛选更加精准高效。本文通过 9 道实战练习题&#xff0c;详解逻辑运算符、比较运算符及模糊匹配的用法&#xff0c;帮你快速掌握运算符的核心应用场景。…

【R语言】更换电脑后,如何在新设备上快速下载原来设备的 R 包?

【R语言】更换电脑后&#xff0c;如何在新设备上快速下载原来设备的 R 包&#xff1f; 在日常使用 R 进行数据分析时&#xff0c;我们往往会安装很多包&#xff08;packages&#xff09;&#xff0c;一旦更换电脑&#xff0c;手动一个一个重新安装会非常麻烦。本文介绍一种简单…

如何在 Ubuntu 24.04 或 22.04 LTS 上安装 PowerShell

在本教程中,我们将学习如何在 Ubuntu 24.04 Noble 或 22.04 Jammy JellyFish Linux 中通过命令终端安装 Microsoft Windows PowerShell。 Windows PowerShell 既是一个命令行外壳程序,也是一种脚本语言。它拥有超过 130 个遵循一致语法和命名约定的命令行工具,称为 cmdlet(…