在C 中,編譯器為const常量分配記憶體空間嗎

時間 2022-03-12 21:00:32

1樓:

在c語言中,用const定義的常量其實是值不能修改的變數,因此會給它分配儲存空間;但是在c++中,const定義的常量要具體情況具體對待:對於基本資料型別的常量,編譯器會把它放到符號表中而不分配儲存空間,而adt/udt的const物件則需要分配儲存空間(大物件)。還有一些情況下也需要分配儲存空間,例如強制宣告為extern的符號常量或取符號常量的地址等操作。

2樓:

在c++中,const定義的常量要具體情況具體對待:對於基本資料型別的常量,編譯器會把它放到符號表中而不分配儲存空間

3樓:

這個要看不同的編譯器,理論上將是必須會的,但是一些編譯器會將沒有隻定義沒有使用的const常量並不分配空間。

4樓:匿名使用者

象這種問題自己多想想就可以了。const int a = 9;想知道a是否佔有空間,你直接in size = sizeof(a);不就出來了。size = 0;就表示不佔啊,size > 0;就佔有空間啊!

想問題要換種思路去看。

5樓:asdf灬

分配,但只分配一次。

6樓:匿名使用者

這類問題去 csdn 社群問更合適.

(c++記憶體佈局)問題:編譯器會為例項的方法分配記憶體嗎?

7樓:

類的例項只包括的非靜態成員變數,繼承來的成員變數,虛擬函式表指標變數(如果存在虛擬函式的話)。

類的方法不存在類的例項所開闢的空間內的。

類的方法會在引數列表中插入一個this指標作為引數,所以類的方法不存在類的例項的記憶體空間裡,也能訪問例項的成員。

例如:a a;

a.get();//相當於a.get(&a),這個是由編譯器完成的;當然this指標一般都是不顯式寫出來的,如果你想寫出來也是對的

8樓:**的可樂

所有該類的例項只需要同一塊記憶體來存放這些例項的相應方法,因為對於所有例項而言,方法是相同的。

實際的存放規則應該是:

宣告一個類的時候,該類不佔用任何記憶體。

宣告第一個該類的例項,系統為該類(不是例項)的所有方法分配一塊記憶體a,為該類(不是例項)的所有全域性成員分配一塊記憶體b,為該例項(注意,這裡是例項,不是類)的所有非全域性成員分配一塊記憶體c,併為該例項(不是類)分配一塊額外的記憶體d,用來存放指向各個方法的函式指標。

呼叫某個例項的方法的時候,實際上只是呼叫了記憶體d中的函式指標。

c語言中const有什麼用途

9樓:靠名真tm難起

可以定義const常量,具有不可變性。

例如:const int max=100; max++會產生錯誤;

便於進行型別檢查,使編譯器對處理內容有更多瞭解,消除了一些隱患。

例如: void f(const int i) 編譯器就會知道i是一個常量,不允許修改;

可以避免意義模糊的數字出現,同樣可以很方便地進行引數的調整和修改。 同巨集定義一樣,可以做到不變則已,一變都變!

如(1)中,如果想修改max的內容,只需要它修改成:const int max=you want;即可!

可以保護被修飾的東西,防止意外的修改,增強程式的健壯性。 還是上面的例子,如果在函式體內修改了i,編譯器就會報錯;

例如: void f(const int i)

可以節省空間,避免不必要的記憶體分配。 例如:

#define pi 3.14159 //常量巨集

const double pi=3.14159; //此時並未將pi放入ram中 ......

double i=pi; //此時為pi分配記憶體,以後不再分配!

double i=pi; //編譯期間進行巨集替換,分配記憶體

double j=pi; //沒有記憶體分配

double j=pi; //再進行巨集替換,又一次分配記憶體!

const定義常量從彙編的角度來看,只是給出了對應的記憶體地址,而不是像#define一樣給出的是立即數,所以,const定義的常量在程式執行過程中只有一份拷貝,而#define定義的常量在記憶體中有若干份拷貝。

6. 提高了效率。

編譯器通常不為普通const常量分配儲存空間,而是將它們儲存在符號表中,這使得它成為一個編譯期間的常量,沒有了儲存與讀記憶體的操作,使得它的效率也很高。

擴充套件資料:const是一個c語言(ansi c)的關鍵字,具有著舉足輕重的地位。它限定一個變數不允許被改變,產生靜態作用。

使用const在一定程度上可以提高程式的安全性和可靠性。另外,在**別人**的時候,清晰理解const所起的作用,對理解對方的程式也有一定幫助。另外const在其它程式語言中也有出現,例如pascal、c++、php5、b#.

net、hc08 c、c#等。

10樓:天雲一號

const修飾的資料型別是指常型別,常型別的變數或物件的值是不能被更新的。

const關鍵字的作用主要有以下幾點:

(1)可以定義const常量,具有不可變性。 例如:

const int max=100; int array[max];

(2)便於進行型別檢查,使編譯器對處理內容有更多瞭解,消除了一些隱患。例如: void f(const int i) 編譯器就會知道i是一個常量,不允許修改;

(3)可以避免意義模糊的數字出現,同樣可以很方便地進行引數的調整和修改。

(4)可以保護被修飾的東西,防止意外的修改,增強程式的健壯性。 還是上面的例子,如果在函式體內修改了i,編譯器就會報錯; 例如:

void f(const int i)

(5) 為函式過載提供了一個參考。

class a //一個函式

void f(int i) const //上一個函式的過載 ......

}; (6) 可以節省空間,避免不必要的記憶體分配。 例如:

#define pi 3.14159 //常量巨集

const doulbe pi=3.14159; //此時並未將pi放入rom中 ......

double i=pi; //此時為pi分配記憶體,以後不再分配!

double i=pi; //編譯期間進行巨集替換,分配記憶體

double j=pi; //沒有記憶體分配

double j=pi; //再進行巨集替換,又一次分配記憶體!

const定義常量從彙編的角度來看,只是給出了對應的記憶體地址,而不是象#define一樣給出的是立即數,所以,const定義的常量在程式執行過程中只有一份拷貝,而#define定義的常量在記憶體中有若干個拷貝。

(7) 提高了效率。 編譯器通常不為普通const常量分配儲存空間,而是將它們儲存在符號表中,這使得它成為一個編譯期間的常量,沒有了儲存與讀記憶體的操作,使得它的效率也很高。

11樓:匿名使用者

(1)可以定義 const 常量

12樓:千鋒教育

const是一個c語言的關鍵字,它限定一個變數不允許被改變。使用const在一定程度上可以提高程式的安全性和可靠性。另外,在**別人**的時候,清晰理解const所起的作用,對理解對方的程式也有一些幫助。

另外const在其他程式語言中也有出現,如c++、php5、c#.net、hc08 c。

(1)可以定義const常量,具有不可變性。

例如:const int max=100; max++會產生錯誤;

(2)便於進行型別檢查,使編譯器對處理內容有更多瞭解,消除了一些隱患。

例如: void f(const int i) 編譯器就會知道i是一個常量,不允許修改;

(3)可以避免意義模糊的數字出現,同樣可以很方便地進行引數的調整和修改。 同巨集定義一樣,可以做到不變則已,一變都變!

如(1)中,如果想修改max的內容,只需要:const int max=you want;即可!

(4)可以保護被修飾的東西,防止意外的修改,增強程式的健壯性。 還是上面的例子,如果在函式體內修改了i,編譯器就會報錯;

例如: void f(const int i)

13樓:匿名使用者

const是一個關鍵字,用它在c或c++中可以定義一個常量,特點是這個常量不可以在程式中被修改,一但被程式意外修改編譯器就會報錯。

c和c++中const的區別是什麼?請說具體點

14樓:匿名使用者

c中的const,功能比較單一,較容易理解:

作用:被修飾的內容不可更改。

使用場合: 修飾變數,函式引數,返回值等。(c++中應用場合要豐富的多)

特點: 是執行時const,因此不能取代#define用於成為陣列長度等需要編譯時常量的情況。同時因為是執行時const,可以只定義而不初始化,而在執行時初始化。

如 const int iconst;。 另外,在c中,const變數預設是外部連結,因此在不同的編譯單元中如果有同名const變數,會引發命名衝突,編譯時報錯。

c++中的const:跟c中比較,內容要豐富很多,當然,作用也更大了

1:非類成員const

*在c++中,const變數(在這裡涉及的const都不是類中的const,類中的const專門提出來記錄)預設是內部連線的,因此在不同的編譯單元中可以有同名的const 變數定義。

*是編譯時常量,因此可以像#define一樣使用,而且因為上面一點,可以在標頭檔案中定義const變數,包含的不同的cpp檔案(編譯單元)中使用而不引起命名衝突。

*編譯器預設不為const變數分配記憶體,除非:1. 使用 extern 申明, 2:程式中有引用const 變數的地址。

* 可以使用下面的型別轉換(不安全的): 1: int * = (int *)pconst 2: int * = const_castpconst(c++解const屬性cast)

* 函式引數或者返回值能使用 const & or const * 時,儘量使用const屬性,增強程式健全性。

*c++中臨時物件/內建變數預設具有const屬性

2:類中的const

*類中的const與c語言中的const一樣,只是執行時常量,不能作為陣列維數使用,即不能取代#define。在類中使用下面兩種方式取代#define: 1:

static const... 2: enum//enum 不佔儲存空間

*類中的const 變數佔用儲存空間

*類中的const成員變數需要在建構函式初始化列表中初始化

*const 物件:在該物件生命週期內,必須保證沒有任何成員變數被改變。const物件只能呼叫const成員函式。

*const成員函式: void fun() const ... 不僅能被const物件呼叫,也能被非const物件呼叫,因此,如果確認一個任何成員函式不改變任何成員變數,應該習慣性將該函式定義成const型別。

如果const成員函式需要改變成員變數,有兩種實現方式: 1 ,const_castthis強制取消this指標的const屬性。 2:

將被改變的成員變數定義成mutable:mutable int i; //應永遠只使用第二種方法,讓任何閱讀程式的人都知道該變數可能被const函式改變。

*如果一個物件被定義成const,那麼該const物件「可能」會被放入到rom當中,這在嵌入式開發當中有時非常重要。。。。(不能有任何自定義的constructor 和destructor。它的基類或者成員物件不能有自定義的constructor和destructor,不能有任何mutable成員變數)

常見的c語言編譯器是什麼,常見的C語言編譯器是什麼?

陝西it優就業 1.c語言程式設計軟體有哪些 mcrosoft visual c microsoft visual studio dev c code blocks borland c watcom c borland c builder gnu djgpp c lccwin32 c compile...

新人學C 用什麼編譯器好

最常用的是vs2003和vs2005 2008目前還沒什麼公司使用,多半是個人。另外2003在裝的時候經常出現莫名其妙的問題就裝不起。2005不會,並且2005有很多方便的熱鍵可以用,不過2005帶有智慧感知,可以幫你補充上你可能需要的資料。但是如果你使用va外掛幫助程式設計的話,會比2005自帶的...

Mac下的c 編譯器有哪些

當然是可以的。mac系統本質上是一個unix系統,unix系統就是以c語言編寫的。目前mac os x的開發工具為xcode,支援c和標準c 程式的編寫。而mac平臺也有不少支援c語言程式設計的ide,像netbeans和eclipse。不過,mac os x目前預設沒有c語言的編譯器,你需要安裝x...