關於const的問題

2021-09-30 08:54:55 字數 1726 閱讀 5218

在一本書上看到下面的講解,然後在vs2008下除錯了一下,發現在const int n=100;這條語句時,有記憶體分配發生,並不是作者所說的那樣,請問這是與編譯器相關的嗎?

分配不分配看編譯器實現者的心情。

一般要取n的位址時,可能必須要分配記憶體了。

作者在講解const與define的對比時,提到了const的乙個特點是:節省空間,避免不必要的記憶體分配,同時提高效率。作者指出,編譯器通常不為普通const唯讀變數分配記憶體儲存空間,而是將它們儲存在符號表中,這使得它成為乙個編譯期間的值,沒有了儲存與讀記憶體的操作,使得它的效率也很高。然後就舉了上面的例子。

作者的意思是:const變數在記憶體中只有乙份拷貝;而巨集定義可能存在若干個拷貝。

謝謝,如果vs是這樣實現的,好像就不存在作者所說的,「這使得它成為乙個編譯期間的值,沒有了儲存與讀記憶體的操作,使得它的效率也很高。」

lz,你試試將const int n = 100;放到main()函式之外,再看看彙編是不是有所變化呢!

同時,0042d625 mov dword ptr [a],64h 這一句不正是直接用100來替換n的嗎?

另外,作者對於const與define的比較說明實在不敢苟同,怎麼會扯到記憶體分配、提高效率這個上面來呢?建議別再看這樣的書了!

實際上一般我們說用const替換define的真正含義是「用編譯器來替換預處理器,以解決強資料型別的要求」,也就是說用編譯器來檢查資料型別是否匹配,以避免預處理器因資料型別問題而帶來的***。

盡信書則不如無書,直觀的理解看,你這個int a=n沒有任何理由要求n有儲存空間,在編譯期間把n的值直接替換成立即數沒有任何問題。我懷疑要麼書寫錯了,要麼你沒理解書

在我看來,任何試圖獲得常量位址的行為都是不合理的。既然是常量,你就不可能去修改它,你取他位址又什麼用

哎,有些書真是害人不淺。

樓主如果懂彙編的話,就知道了

0042d61e mov dword ptr [n],64h 

這句彙編表明n已經在記憶體裡分配了。

如果const是全域性常量的話,一般的編譯器會將其當作編譯期常量,(預處理)編譯時的時候就全部被直接用其值替換了。

書上的作者在談到const的特點時,提到了乙個優點:「節省空間,避免不必要的記憶體分配,同時提高效率」。

我的疑問是:

當const變數是全域性的時候,vs編譯器沒有為其分配儲存空間,即像17l所言,把當做立即數進行替換。

但是,當宣告const變數為區域性變數的時候,vs編譯器是為其分配了空間的。這樣的話,所提的const的這個「優點」是不是特指的全域性變數的時候呢。

我只是想驗證一下作者的提法是否正確,並無其他意思。

下面摘自原文:

const定義的唯讀變數從彙編的角度來看,只是給出了對應的記憶體位址(好像不是這樣,vs下全域性和區域性的時候都是用立即數直接賦值的,並沒有出現記憶體位址呀),而不是像#define一樣給出的是立即數,所以,const定義的唯讀變數在程式執行過程中只有乙份拷貝,而#define定義的巨集常量在記憶體中有若干個拷貝。#define巨集是在預編譯階段進行替換,而const修飾的唯讀變數是在編譯的時候確定其值。#define巨集沒有型別,而const修飾的唯讀變數具有特定的型別。

您的意思是在d模式下**沒有進行優化,所以討論這個沒有意義嗎。那該如何測試呢?

熱水器上的溫度顯示、電子錶上的數字時鐘這些也是介面顯示。先用c熟練顯示這些比在pc上顯示win視窗有意義的多。要知道,win視窗僅是這二十年內的事情,也僅僅代表了部分程式設計的介面顯示。並不是所有程式設計師要求會畫win視窗的。

關於 define 和const 的問題

小生在寫 cuda 程式時遇到的乙個問題就是 對 define 和const 有疑問到底哪個執行的速度更加快一些呢 define 一般來說用於 字串 string 和數字的 替代,預設區分大小寫 我們將這個 define 又稱做巨集 所有叫做巨集的都有乙個特點就是,它是在預處理時的文字替換,替換了之...

關於const的筆記

今天讓指標常量,常量指標的說法搞糊塗了,原理明白,但是叫法上的區分糊塗呵呵!const是c特別是c 中經常遇到的東西,能靈活的運用可以體現你的cc 的水平。1.常量和預編譯 我們都知道在c中用到常量往往是通過預編譯來實現,但是這樣最大的缺點是不能夠進行型別檢查,使用const修飾變數就可以客服這樣的...

關於const的總結

const int a const integer int const a const integer int const a integer poiter to const integer int const a const integer poiter to integer int a cons...