3

考虑以下情况

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);
}

wrt 可读性,Case3 是最直接的

为了加快速度,对于一个体面的编译器,以上所有情况都等效吗?如果不是,它们中的哪一个是最快的和最慢的?

假设所有指针都是原始指针并且它们指向堆中的对象。

更新:假设参数是const一个如上所示的参数,因此 func1 和 func2 可以通过值或 const 引用来获取参数。

4

2 回答 2

1

假设两个函数都通过 value 获取参数,案例 3 至少与案例 1 一样快,案例 1 至少与案例 2 一样快。

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

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

如果这些是宏而不是函数,那么所有的赌注都没有了。

于 2012-09-28T19:02:29.150 回答
0

在第一种情况下,您在 val 中引用 a->b->c->d,因此来自编译器的 pov val 是一个取消引用的指针。

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

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

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

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

于 2012-09-28T19:02:33.310 回答