考虑以下案例
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引用获取参数。
答案 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
你可以清楚地看到第三个是最快的