有些博客和网站在谈论指针是有益的原因之一是因为“指针”程序中的“执行速度”会好于没有指针。我能解决的问题是:
取消引用单个位置需要两次(或更多次)内存访问(取决于间接数)。与直接使用相比,这将增加执行时间。
将指向大型数据类型的指针传递给函数,就像结构一样可能是有益的,因为只有结构/联合的地址被复制并且它不会被值传递。因此,在这种情况下应该更快。
例如,只需强制引入指针而不需要:
int a, b, *p, *q, c, *d;
p = &a;
q = &b;
d = &c
// get values in a, b
*d = *p + *q; // why the heck this would be faster
c = a + b; // than this code?
我使用gcc -S -masm=intel file.c
检查了汇编程序输出。指针版本有很多加载内存并存储除了直接方法之外的引用。
我错过了什么吗?
注意:问题与代码无关。代码只是一个例子。不考虑编译器优化。
答案 0 :(得分:6)
我认为你的结论基本上是正确的。作者并不是说使用更多指针总是会加速所有代码。这显然是无稽之谈。
但有时候将指针传递给数据而不是复制数据会更快。
答案 1 :(得分:1)
正如您所指出的:将指向大型数据类型的指针传递给函数;这里的结构是int
,所以它几乎不大。顺便说一句:我猜gcc会在你使用-O2时优化指针访问。
除此之外,您的理解是正确的。
答案 2 :(得分:1)
在你的例子中你是对的 - 代码会运行得更慢。一个可以更快的地方是进行函数调用时:
void foo( Object Obj );
void bar( const Object * pObj );
void main()
{
Object theObject;
foo( theObject ); // Creates a copy of theObject which is then used in the function.
bar( &theObject ); // Creates a copy of the memory address only, then the function references the original object within.
}
bar
更快,因为我们不需要复制整个对象(假设对象不仅仅是基础数据类型)。但是,大多数人会使用引用而不是指针。
void foobar( const Object & Obj );
答案 3 :(得分:-1)