old*_*ool 7 c c++ pointers local dereference
我有一个关于指针解除引用速度的问题.我有这样的结构:
typedef struct _TD_RECT TD_RECT;
struct _TD_RECT {
double left;
double top;
double right;
double bottom;
};
Run Code Online (Sandbox Code Playgroud)
我的问题是,哪一个更快,为什么?
情况1:
TD_RECT *pRect;
...
for(i = 0; i < m; i++)
{
if(p[i].x < pRect->left) ...
if(p[i].x > pRect->right) ...
if(p[i].y < pRect->top) ...
if(p[i].y > pRect->bottom) ...
}
Run Code Online (Sandbox Code Playgroud)
案例2:
TD_RECT *pRect;
double left = pRect->left;
double top = pRect->top;
double right = pRect->right;
double bottom = pRect->bottom;
...
for(i = 0; i < m; i++)
{
if(p[i].x < left) ...
if(p[i].x > right) ...
if(p[i].y < top) ...
if(p[i].y > bottom) ...
}
Run Code Online (Sandbox Code Playgroud)
因此,在第1种情况下,循环直接取消引用pRect指针以获取比较值.在第2种情况下,在函数的局部空间(堆栈上)上创建了新值,并将值从pRect复制到局部变量.通过循环将有许多比较.
在我看来,它们同样会很慢,因为局部变量也是堆栈上的内存引用,但我不确定......
另外,最好继续通过索引引用p [],或者将p递增一个元素,并在没有索引的情况下直接取消引用它.
有任何想法吗?谢谢 :)
pax*_*blo 12
您可能会发现它对现代编译器没有任何影响.他们中的大多数可能会执行常见的subexpresion消除循环内不会改变的表达式.假设C语句和汇编代码之间存在简单的一对一映射,这是不明智的.我已经看到gcc泵出代码会让我的汇编技能感到羞耻.
但这既不是C也不是C++问题,因为ISO标准并未强制要求如何完成.检查确定的最好方法是生成类似的汇编代码,gcc -S并详细检查这两种情况.
如果你避开这种微优化并且更多地关注宏观层面,例如算法选择等,你也会获得更多的投资回报.
并且,与所有优化问题一样,测量,不要猜!有太多的变量,可以影响它,所以你应该标杆不同的方式在目标环境中,并用真实数据.
我认为第二种情况可能会更快,因为您没有在每次循环迭代时取消对指向 pRect 的指针的引用。
实际上,进行优化的编译器可能会注意到这一点,并且生成的代码可能没有差异,但 pRect 可能是 p[] 中某个项目的别名,这可能会阻止这种情况发生。