为变量创建本地别名是否增加了开销?

时间:2012-09-28 18:55:22

标签: c++ reference

考虑以下案例

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引用获取参数。

2 个答案:

答案 0 :(得分:1)

假设两个函数都按值获取其参数,则案例3至少与案例1一样快,这至少与案例2一样快。

正如Ruakh在评论中提到的那样,在优化发生之前需要进行一些复杂的数据流分析。

如果函数参数是引用,则可能永远不会发生值的最终内存加载。案例1将是最快的。

如果这些是宏而不是功能,那么所有的赌注都会被取消。

答案 1 :(得分:0)

在第一个场景中,你在val中引用了a-> b-> c-> d,因此编译器的pov val是一个解除引用的指针。

速度第三个是最快的,因为它只是创建一个值的副本而不是使用那个。

前两种方法的问题是你必须取消引用指针以获取值,所以你必须这样做

case 1
lea eax,[ebp+a]
push eax

case 2
lea eax, [ebp+a]
lea ebx, [eax]
....

case 3
mov eax [ebp+val]
push eax

你可以清楚地看到第三个是最快的