[英]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.