3 回答

TA貢獻(xiàn)1836條經(jīng)驗 獲得超4個贊
情況1:-
當(dāng)您在程序中聲明const時,
int const x = 2;
編譯器可以通過不為該變量提供存儲,而是將其添加到符號表中來優(yōu)化此const。因此,后續(xù)讀取僅需要間接進(jìn)入符號表,而不是從內(nèi)存中獲取值的指令。
注意:-如果您執(zhí)行以下操作:-
const int x = 1;
const int* y = &x;
然后,這將迫使編譯器為分配空間'x'。因此,這種情況下的優(yōu)化程度是不可能的。
就功能而言,參數(shù)const表示未在函數(shù)中修改參數(shù)。據(jù)我所知,使用const它并不會帶來實質(zhì)性的性能提升,而是確保正確性的一種手段。
案例_2:-
“將參數(shù)和/或返回值聲明為const是否有助于編譯器生成更多優(yōu)化代碼?”
const Y& f( const X& x )
{
// ... do something with x and find a Y object ...
return someY;
}
Ques =>編譯器可以做得更好嗎?
=>是否可以避免復(fù)制參數(shù)或返回值?
否,因為參數(shù)已通過引用傳遞。
=>可以將x或someY的副本放入只讀內(nèi)存嗎?
否,因為x和someY都超出其范圍,并且來自和/或提供給外部世界。即使someY在f()本身內(nèi)部動態(tài)地動態(tài)分配,它和它的所有權(quán)也由調(diào)用者放棄。
Ques =>關(guān)于出現(xiàn)在f()主體內(nèi)部的代碼的可能的優(yōu)化呢?由于使用了const,編譯器能否以某種方式改進(jìn)它為f()主體生成的代碼?
即使您調(diào)用const成員函數(shù),編譯器也無法假定對象x或?qū)ο髎omeY的位不會更改。此外,還有其他問題(除非編譯器執(zhí)行全局優(yōu)化):編譯器也可能不確定是否其他代碼可能沒有非常量引用來別名相同的對象作為x和/或someY,以及是否存在此類引用。在執(zhí)行f()時,可能會偶然使用對同一對象的非const引用;并且編譯器甚至可能根本不知道x和someY僅僅是引用的實際對象是否實際上首先聲明為const。
案例3:
void f( const Z z )
{
// ...
}
Ques =>會不會有任何優(yōu)化?
是的,因為編譯器知道z確實是一個const對象,所以即使沒有全局分析它也可以執(zhí)行一些有用的優(yōu)化。例如,如果f()的主體包含類似g(&z)的調(diào)用,則編譯器可以確保z的不可更改部分在調(diào)用g()時不會發(fā)生變化。

TA貢獻(xiàn)1804條經(jīng)驗 獲得超3個贊
在給出任何答案之前,我想強(qiáng)調(diào)指出,const真正使用或不使用的原因應(yīng)該是為了程序正確性和其他開發(fā)人員的清晰度,而不是編譯器優(yōu)化。也就是說,使參數(shù)const記錄該方法將不會修改該參數(shù),而使成員函數(shù)const記錄該成員將不會修改該對象是其成員的對象(至少不會以邏輯方式更改任何對象的輸出)其他const成員函數(shù))。例如,這樣做可以使開發(fā)人員避免制作不必要的對象副本(因為他們不必?fù)?dān)心原始對象將被破壞或修改)或避免不必要的線程同步(例如,通過知道所有線程僅讀取并執(zhí)行)不會使相關(guān)對象發(fā)生變異)。
就優(yōu)化而言,至少在理論上,編譯器可以采用優(yōu)化模式,盡管允許其做出可能破壞標(biāo)準(zhǔn)C ++代碼的某些非標(biāo)準(zhǔn)假設(shè),但請考慮以下因素:
for (int i = 0; i < obj.length(); ++i) {
f(obj);
}
假設(shè)該length函數(shù)被標(biāo)記為,const但實際上是一個昂貴的操作(假設(shè)它實際上以O(shè)(n)時間而不是O(1)時間運行)。如果函數(shù)f通過const引用獲取其參數(shù),則編譯器可能會優(yōu)化此循環(huán)以:
int cached_length = obj.length();
for (int i = 0; i < cached_length; ++i) {
f(obj);
}
...因為函數(shù)f不會修改參數(shù)這一事實保證了在length給定對象未更改的情況下,函數(shù)每次應(yīng)返回相同的值。但是,如果f通過可變引用聲明要接受參數(shù),length則將需要在循環(huán)的每次迭代中重新計算,因為f可能已經(jīng)修改了對象,從而產(chǎn)生了值的變化。
如評論中所指出的那樣,這假設(shè)了許多其他警告,并且僅在以非標(biāo)準(zhǔn)模式調(diào)用編譯器時才可能實現(xiàn),該模式允許編譯器做出其他假設(shè)(例如,const方法嚴(yán)格取決于其輸入和輸出的函數(shù))。優(yōu)化可以假定代碼將永遠(yuǎn)不會使用const_cast將const引用參數(shù)轉(zhuǎn)換為可變引用)。
- 3 回答
- 0 關(guān)注
- 673 瀏覽
添加回答
舉報