簡體   English   中英

文字數字是否視為常量?

[英]Are literal numbers treated as constants?

對於像PI這樣的競爭對象,最好先#define它們或將它們聲明為const,以便編譯器可以進行優化,並且不易出錯。 但是,我想知道語句中的立即數如何處理? 例如:

float x;
const int y = 60;
x = y / 3.0f;

在此示例中,將如何處理3.0f? 它會繼承常量的優化嗎?

將進行哪些優化取決於編譯器。 在您的情況下,C和C ++編譯器通常都將具有足夠的信息來將源代碼優化為相同的機器代碼。 換句話說,它實際上並不太依賴於此代碼中的字面量常量

話雖如此,在C和C ++中, 字面量常量的含義存在顯着差異(並且您同時標記了問題C和C ++)。

  • 在C 603.0f常數 ,但是y不是常數 如果願意,可以將y稱為const限定變量 ,但在C術語中它不是常數 ,從某種意義上說,單個y在C中不是常數表達式

至於文字 ,在C語言中, 文字一詞僅適用於字符串文字(以及C99中的復合文字 ),即,您的代碼中根本沒有文字。

  • 在C ++中, 603.0.f文字 ,它們形成常量表達式 (分別為整數和浮點數)。 y也是一個恆定 int型,在一定意義上,單一y是在C ++中的常量表達式

您可能會注意到差異的情況與優化無關,而與語言的定義方式無關。 例如,在文件范圍數組類型聲明中使用上述y在C ++中是合法的,但在C中則不合法

 typedef int int_array[y]; /* OK in C++, ERROR in C */

由於使用#define要求預處理器進行文本替換,因此您的代碼與以下代碼相同:

#define VAL 3.0f

float x;
const int y = 60;
x = y / VAL;

直接const值的優化方式顯然取決於編譯器。 但是,如果您觀看匯編代碼(例如,由gcc生成的匯編代碼),則會注意到編譯器直接在浮點標准中編寫了編碼值3.0的二進制序列。

在某些體系結構上,可以直接使用的字符串文字的大小受到限制。 當字符串文字的大小太大時,編譯器將需要將常量存儲在只讀數據存儲器中的某個位置,然后在需要時從內存中加載值。

如果將值存儲在常量變量中,則編譯器很有可能僅存儲常量的一個值並適當使用。 但是,如果使用##定義常量,則只會使預處理程序將文字值放入代碼中,因此,編譯器有可能無法意識到您正在使用相同的值並多次存儲該常量。 正是由於這個原因,const變量比#defines更好。

答案取決於您使用的是C還是C ++,因此您需要選擇一個並停止假裝它們是同一件事。 在C中, const關鍵字未聲明常量 它聲明了一個變量,嘗試對其進行修改的變量將調用未定義的行為。 在C語言中,永遠不要聲明const int y; 除非它是靜態的/全局的,並且打算將內部信息從一個模塊傳遞到另一個模塊,而您不想在另一個模塊的編譯時將其固定(例如, const int my_library_version = 0x1001;在共享庫中可能很有用,盡管函數調用返回的值會更干凈)。

至於優化,據我所知,沒有C編譯器會優化示例中的除法,是否允許編譯器也存在疑問。

至於C ++,您應該請C ++專家來解釋(我不是誰)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM