C 中 const 的實現原理是什麼?

時間 2021-05-12 22:00:17

1樓:

那麼為什麼在用const_cast去除掉constness以後,對原const變數寫操作會是未定義行為

因為 C++ 只規定了編譯器的行為:C++ 要求編譯器拒絕所有直接修改 const 物件的情況。

但是你在經過 const_cast 之後會碰到什麼與 C++ 無關,是編譯器和具體 OS 的事情。是不是有 .text 唯讀區,是不是會設定記憶體區間唯讀,還是全部放開可寫,都跟 C++ 沒有關係。

C++ 是乙個假裝有執行時和型別強保證的語言,所以……意思意思就好。

2樓:Sting

由編譯器檢查。在PC上,const變數在RAM裡,但是像const char *a="hello world";

這樣宣告的變數,系統會載入到記憶體並把頁面屬性設成唯讀,const_cast後改寫程式會崩潰(如果實在想改可以用系統API把頁面屬性改成讀寫)。如果是const傳遞的C++物件,const_cast後改寫沒什麼問題。

在某些裝置上,const修飾的變數可能會存在ROM/Flash裡,這些儲存介質不能通過記憶體寫操作這屆改寫,因此萬一存在唯讀介質上,const_cast以後強制寫會發生未定義的行為,一般是崩潰掉。

3樓:白如冰

C++中的const有雙重含義

1 用在編譯時就可以計算出的常量表示式初始化的const變數,編譯的時候,編譯器會用常量表示式替換這些const變數。典型的如陣列長度等地方。這種const變數可以在標頭檔案中定義,每乙個包含了標頭檔案的原始檔都有自己file local的東西,然後編譯的時候被替換。

2 在某一作用於里不希望被改變的量。比如作為函式引數傳入等。

在C++11中,第乙個作用已經被constexpr取代。

Push mail 的實現原理是什麼?

Amin 端到端的實現主要有2類 1 手機和郵件伺服器間有個中間伺服器 閘道器,提供推送如 黑莓的BI 蘋果的推送服務 Android的C2DM2 手機直接連郵件伺服器 如 微軟的ActiveSync 不論手機連中間伺服器還是直接連郵件伺服器,推送的實現可以是 1 長連線推送 如 黑莓。2 帶外的通...

高斯模糊的原理是什麼,怎樣在介面中實現?

Rechard Chao 就是乙個低通濾波,影象和濾波函式做乙個卷積就可以了,之所以叫高斯模糊是因為濾波函式是 Gauss distribution. 我不是要噴,只是覺得最高票並沒有說到本質 核心只有三點 卷積 傅利葉變換 高斯濾波器。影象 或者一維訊號 可以理解為一堆余弦訊號的疊加,所謂的 模糊...

為什麼C 中取乙個const的位址就是合法的,但是取乙個enum的位址就不合法?

Jude Gao const int a 0 Here,a is a lvalue.enum Here,a is an rvalue.你只能get address of lvalues. 大熊哥哥 enum 編譯後是個立即數,有個毛位址。假如C規定這種情況取那條指令的位址,可這個位址有毛用?enum...