reinterpret_cast and static cast

什么時候使用 reinterpret_cast?

指針類型之間的轉換: 當需要將一種類型的指針轉換為另一種類型的指針時,可以使用 reinterpret_cast。例如:

int* intPtr = new int(10);
void* voidPtr = reinterpret_cast<void*>(intPtr); // int* 轉換為 void*
int* backToIntPtr = reinterpret_cast<int*>(voidPtr); // void* 轉換回 int*

不同類型指針之間的轉換: 當需要將一種類型的指針轉換為完全不相關的另一種類型的指針時,例如:

int* intPtr = new int(42);
char* charPtr = reinterpret_cast<char*>(intPtr); // int* 轉換為 char*

整數與指針之間的轉換: 在某些底層編程場景中(如嵌入式系統或驅動開發),可能需要將整數轉換為指針,或將指針轉換為整數:

uintptr_t intValue = reinterpret_cast<uintptr_t>(intPtr); // 指針轉換為整數
int* ptr = reinterpret_cast<int*>(intValue); // 整數轉換回指針

處理類層次結構中的非多態類型: 如果類之間沒有繼承關系,或者不涉及虛函數(即非多態類型),可以用 reinterpret_cast 進行類型轉換。例如:

struct A { int x; };
struct B { int y; };
A* a = new A{42};
B* b = reinterpret_cast<B*>(a); // A* 轉換為 B*
  • 危險性:reinterpret_cast 不檢查類型安全性,可能會導致未定義行為(undefined behavior)。使用時必須確保目標類型和源類型在內存布局上兼容。
  • 平臺依賴性:指針大小和內存對齊規則因平臺而異,因此使用 reinterpret_cast 的代碼可能不可移植。
  • 僅在必要時使用:應優先考慮更安全的類型轉換方式,如 static_cast 或 dynamic_cast。只有在明確需要低級別控制且了解風險時才使用 reinterpret_cast。
  • 避免在多態類中使用:如果涉及多態類(有虛函數),應使用 dynamic_cast 或 static_cast,因為 reinterpret_cast 不處理虛表或繼承關系。

使用 static_cast 進行 int* 到 void* 的轉換

在C++中,static_cast 允許在某些類型的指針之間進行安全的隱式轉換,包括將任何類型的指針(如 int*)轉換為 void*。這是因為 void* 是一種通用指針類型,標準允許從任何對象指針類型隱式轉換為 void*,而 static_cast 可以顯式地執行這種轉換。

int* intPtr = new int(42);
void* voidPtr = static_cast<void*>(intPtr); // 合法
int* backToIntPtr = static_cast<int*>(voidPtr); // 合法,假設 voidPtr 指向 intdouble* doublePtr = new double(3.14);
void* voidPtr = static_cast<void*>(doublePtr);
int* intPtr = static_cast<int*>(voidPtr); // 編譯通過,但未定義行為int* intPtr = new int(42);
char* charPtr = static_cast<char*>(intPtr); // 錯誤:編譯失敗
char* charPtr2 = reinterpret_cast<char*>(intPtr); // 合法,但需謹慎

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/92761.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/92761.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/92761.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

自動化運維 | 樂維8.0安裝及簡單使用

文章目錄1.創建虛擬機2.安裝樂維8.03.Web界面登錄訪問4.添加第一個監控在文章的開頭需要感謝樂維帶來這么好的自動化運維系統提供我們學習參考或是在生產環境中進行使用&#xff0c;并附上樂維官網供大家參考和學習&#xff1a;https://www.lwops.cn/1.創建虛擬機 在VMware wo…

無印良品:回歸本質的管理哲學

一、底層管理哲學 First, the underlying management philosophy核心思想&#xff1a;「無印」即「無品牌標識」&#xff0c;回歸產品本質Core idea: "Muji" means "no brand logo", returning to the essence of products.拒絕過度營銷&#xff0c;靠產品…

Redis面試精講 Day 13:Redis Cluster集群設計與原理

【Redis面試精講 Day 13】Redis Cluster集群設計與原理 開篇 歡迎來到"Redis面試精講"系列第13天&#xff0c;今天我們將深入探討Redis Cluster的集群設計與實現原理。作為Redis官方提供的分布式解決方案&#xff0c;Redis Cluster是面試中必問的高頻考點&#xff…

LangChain-Unstructured 基礎使用:PDF 與 Markdown 處理解析

文章目錄LangChain-Unstructured 基礎使用&#xff1a;PDF 與 Markdown 處理解析一、核心依賴與庫說明二、核心類與方法詳解1.UnstructuredLoader&#xff08;1&#xff09;類原型與核心功能&#xff08;2&#xff09;初始化參數詳解&#xff08;3&#xff09;核心方法詳解① l…

uboot使用指南

1.uboot的分類本節是 uboot 的使用&#xff0c;所以就直接使用正點原子已經移植好的 uboot&#xff0c;這個已經放到了開發板光盤中了&#xff0c;路徑為&#xff1a;開發板光盤->1、程序源碼->3、正點原子 Uboot 和 Linux 出廠源碼->uboot-imx-2016.03-2.1.0-ge468cd…

學習率預熱總結

學習率預熱是什么&#xff1f; 學習率預熱&#xff08;Learning Rate Warmup&#xff09; 是一種在深度學習訓練初期逐漸增加學習率的策略。其核心思想是&#xff1a;在訓練開始時使用較小的學習率&#xff0c;逐步增加到目標學習率&#xff0c;以避免模型參數在初始階段因學習…

初識SYSCFG(System Configuration Controller)寄存器映射

SYSCFG&#xff08;System Configuration Controller&#xff09;寄存器映射的詳細說明&#xff0c;以 STM32&#xff08;如 F1/F4/F7 系列&#xff09;為例。SYSCFG 控制器用于系統級配置&#xff0c;如外部中斷映射、存儲器重映射等。SYSCFG 寄存器映射概述 基地址&#xff1…

《P3403 跳樓機》

題目背景DJL 為了避免成為一只咸魚&#xff0c;來找 srwudi 學習壓代碼的技巧。題目描述Srwudi 的家是一幢 h 層的摩天大樓。由于前來學習的蒟蒻越來越多&#xff0c;srwudi 改造了一個跳樓機&#xff0c;使得訪客可以更方便的上樓。經過改造&#xff0c;srwudi 的跳樓機可以采…

【GPT-OSS 全面測評】釋放推理、部署和自主掌控的 AI 新紀元

目錄 一、背景與意義 二、核心參數對比 三、性能評測&#xff08;Benchmark&#xff09; 四、硬件適配與優化 五、安全性與風險 六、部署方式 七、適用場景 八、大型語言模型對比表&#xff08;2025 年 8 月版&#xff09; 總結 一、背景與意義 &#x1f4a1; 為什么…

醫療健康Agent:診斷輔助與患者管理的AI解決方案

醫療健康Agent&#xff1a;診斷輔助與患者管理的AI解決方案 &#x1f31f; Hello&#xff0c;我是摘星&#xff01; &#x1f308; 在彩虹般絢爛的技術棧中&#xff0c;我是那個永不停歇的色彩收集者。 &#x1f98b; 每一個優化都是我培育的花朵&#xff0c;每一個特性都是我放…

python魔法屬性__doc__介紹

doc: 魔法屬性。類、函數的描述信息。 __doc__在python中類的使用方法&#xff1a; class Person(object):"""人類---類的描述信息""" # 只能使用多行注釋&#xff0c;單行注釋無效passprint(Person.__doc__)運行結果如圖所示&#xff1a;__d…

PostgreSQL 批量COPY導入優化參數配置

&#x1f4a1; 場景假設我們進行的是 頻繁批量導入、對數據持久性容忍較高 的場景&#xff0c;比如日志表、緩存表、臨時數據表等。如果系統崩潰可重導入&#xff0c;那我們就可以犧牲一點寫入安全性來換極致性能。?? 參數配置推薦&#xff08;postgresql.conf&#xff09;參…

BeanDefinition 與 Bean 生命周期(面試高頻考點)

Bean 是 Spring 應用的核心組件&#xff0c;而 BeanDefinition 作為 Bean 的 “元數據描述”&#xff0c;貫穿了 Bean 從定義到銷毀的全生命周期。理解 BeanDefinition 的加載注冊機制&#xff0c;以及 Bean 的完整生命周期&#xff0c;是掌握 Spring 容器管理邏輯的關鍵&#…

node.js 學習筆記2 進程/線程、fs

進程和線程 進程&#xff1a;進行中的程序。比如有一段程序&#xff0c;程序已經載入內存了&#xff0c;CPU正在執行這段程序&#xff0c;這時候就會產生一個進程。進程&#xff0c;也可以看做程序的一次執行過程。 在window中打開任務管理器&#xff0c;可以查看計算機中的所…

【線性代數】其他

上一節&#xff1a;【線性代數】線性方程組與矩陣——&#xff08;3&#xff09;線性方程組解的結構 總目錄&#xff1a;【線性代數】目錄 文章目錄11. 向量的內積、長度及正交性12. 方陣的特征值與特征向量13. 相似矩陣14. 對稱矩陣的對角化15. 二次型及其標準形11. 向量的內積…

Spring Cloud LoadBalancer 實現自定義負載均衡策略(基于服務元數據篩選)

&#x1f4a1; Spring Cloud LoadBalancer 實現自定義負載均衡策略&#xff08;基于服務元數據篩選&#xff09; 在微服務架構中&#xff0c;我們常常希望對服務實例進行更精細的路由控制&#xff0c;例如&#xff1a; 灰度發布&#xff1a;不同環境訪問不同版本操作系統差異&a…

Javaweb(1)html、css、js

注:圖來自黑馬 一、HTML(超文本標記語言) HTML 是網頁的 “骨架”,負責定義頁面的結構和內容,通過標簽(tag)描述文本、圖片、鏈接等元素。 1. 基礎結構 文檔聲明:<!DOCTYPE html>(告訴瀏覽器這是 HTML5 文檔)。 根標簽:<html> 包裹整個文檔,包含 &l…

MQTT:Dashboard數據集成(待補充)

目錄一、工作原理二、基本使用三、連接器基本使用一、工作原理 數據集成使用sink和source組件與外部數據系統對接。 sink&#xff1a;用于將消息發送到外部數據系統&#xff0c;例如MySQL、Kafka或Http服務等。source&#xff1a;用于從外部數據系統接收消息&#xff0c;例如…

VisionMoE本地部署的創新設計:從架構演進到高效實現

本地部署VisionMoE的時代需求 在人工智能技術飛速發展的今天&#xff0c;視覺語言模型(Vision-Language Models, VLMs)已成為多模態理解的核心工具。然而&#xff0c;傳統的大型視覺語言模型主要依賴云端GPU集群進行部署和推理&#xff0c;這不僅帶來了高昂的運營成本&#xf…