簡體   English   中英

是否應在代碼中定義常量以重復文字?

[英]Should I define constants for repeating literals in the code?

我有一個這樣的示例代碼,其中文字1重復了幾次。

foo(x - 1);
y = z + 1;
bar[1] = y;

我應該定義一個常量ONE ,並用它替換文字嗎?

constexpr int ONE = 1;
foo(x - ONE);
y = z + ONE;
bar[ONE] = y;

這種替換是否會提高性能和/或減少機器代碼的大小,從而降低代碼的可讀性? 文字重復的次數會改變答案嗎?

它不會為您帶來任何性能/內存改進。 但是,您應該嘗試使代碼遠離幻數 因此,如果您的代碼在多個位置都有一個重復的常量,並且在所有這些位置上, 從邏輯的角度來看 ,此常量都是相同 ,則最好將其命名為常量。

例:

const int numberOfParticles = 10; //This is just an example, it's better not to use global variables.

void processParticlesPair(int i, int j) {
    for (int iteration = 0; iteration < 10; ++iteration) {
        //note, that I didn't replace "10" in the line above, because it is not a numberOrParticles, 
        //but a number of iterations, so it is a different constant from a logical point of view.


        //Do stuff
    }
}

void displayParticles() {
    for (int i = 0; i < numberOfParticles; ++i) {
        for (int j = 0; j < numberOfParticles; ++j) {
            if (i != j) {
                processParticlesPair(i, j);
            }
        }
    }
}

要看。 如果您的代碼中只有1 s,並且詢問是否應該替換它們:不要。 保持代碼干凈。 您將沒有任何性能或內存優勢-更糟糕的是,您可能會增加構建時間
但是,如果1是構建時參數:是,請引入一個常數! 但是,選擇一個比ONE更好的名字!

我應該定義一個常量ONE ,並用它替換文字嗎?

不,絕對不是。 如果你有一個表示號碼(如含義的名稱NumberOfDummyFoos ),如果其值可以改變,你要防止不必更新它在十幾個地方,然后你可以使用一個常數,而是一個不斷ONE增加絕對沒有文字1價值。

這種替換是否會提高性能和/或減少機器代碼的大小,從而降低代碼的可讀性?

在任何現實的實現中,事實並非如此。

如果常量的含義很特殊,則用命名常量替換文字是有意義的。 在大多數情況下,用ONE替換1只是開銷,並且不會向閱讀器添加任何有用的信息,尤其是當它用於不同的功能(索引,計算的一部分等)時。 如果數組的入口1有點特殊,則使用常量THE_SPECIAL_INDEX=1會很有意義。 對於編譯器,通常沒有任何區別。

在匯編中,一個常數值通常占用與其他任何值相同的內存量。 在源代碼中設置常量值比優化更能給人類帶來便利。

在這種情況下,以這種方式使用ONE既不會提高性能也不會提高可讀性。 這就是為什么您以前可能從未在源代碼中看到它的原因;)

暫無
暫無

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

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