考慮以下情況是否爲變量添加開銷創建本地別名?
void func(const A& a)
{
//Case 1:
const int& val = a->b->c->d;
func1(val);
func2(val);
//Case 2:
func1(a->b->c->d);
func2(a->b->c->d);
//Case3:
int val = a->b->c->d;
func1(val);
func2(val);
}
w.r.t可讀性,CASE3是最直接的
w.r.t速度,一個體面的編譯器,是上述情況等同呢?如果不是最快和最慢的哪一個?
假設所有指針都是原始指針,並且它們指向堆中的對象。
更新:假設參數是const
,如上所示,因此func1和func2可以通過值或通過const引用接受參數。
值得注意的是,如果'func1'可以修改'a','a-> b','a-> b-> c'和/或''a'',那麼這三個代碼片段實際上可能是非等價的。 A-> B-> C-> D'。因此,編譯器可以將它們全部優化爲相同代碼的唯一方法是,它是否可以訪問'func1'的定義,或者可以以某種方式確認它們在功能上等同。 – ruakh
@ruakh如果func1只傳遞了'd'的值,那麼'func1'如何修改'a','b'或'c'? –
@Dave:也許'a'是一個全局變量。 –