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
英文地址,請注明出處:http://en.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(…