0

我有兴趣从一开始就编写好的代码,而不是以后优化代码。很抱歉没有提供基准我目前没有工作场景。感谢您的关注!

使用 FunctionY 优于 FunctionX 的性能提升是什么?

已经有很多关于 stackoverflow 的讨论,但我对访问子成员(递归)时的情况表示怀疑,如下所示。编译器(比如 VS2008)会将 FunctionX 优化为 FunctionY 之类的东西吗?

void FunctionX(Obj * pObj)
{
   pObj->MemberQ->MemberW->MemberA.function1();
   pObj->MemberQ->MemberW->MemberA.function2();
   pObj->MemberQ->MemberW->MemberB.function1();
   pObj->MemberQ->MemberW->MemberB.function2();
   ..
   pObj->MemberQ->MemberW->MemberZ.function1();
   pObj->MemberQ->MemberW->MemberZ.function2();
}

void FunctionY(Obj * pObj)
{
   W * localPtr = pObj->MemberQ->MemberW;
   localPtr->MemberA.function1();
   localPtr->MemberA.function2();
   localPtr->MemberB.function1();
   localPtr->MemberB.function2();
   ...
   localPtr->MemberZ.function1();
   localPtr->MemberZ.function2();
}
4

3 回答 3

2

如果没有任何成员指针是 volatile 或指向 volatile 的指针,并且您没有operator ->为链中的任何成员重载,则两个函数都是相同的。您建议的优化规则被广泛称为通用表达式消除,几十年来绝大多数编译器都支持。

于 2012-09-13T23:13:21.400 回答
1

理论上,您节省了额外的指针取消引用,但是,在现实世界中,编译器可能会为您优化它,所以这是一个无用的优化。

这就是为什么重要的是首先进行分析,然后再进行优化。编译器正在尽其所能帮助您,您不妨确保您不只是在做它已经在做的事情。

于 2012-09-13T23:14:08.170 回答
0

如果编译器足够好,它应该将 functionX 转换为类似于 functionY 的东西。但是您可以在不同的编译器和具有不同优化标志的同一编译器上得到不同的结果。使用“哑”编译器函数应该更快,恕我直言,它更具可读性和编码速度。所以坚持使用功能Y

附言。你应该看看一些代码风格指南,通常成员和函数名应该总是以小写字母开头

于 2012-09-13T23:14:50.213 回答