指针和执行速度

时间:2012-12-20 07:56:24

标签: c pointers

有些博客和网站在谈论指针是有益的原因之一是因为“指针”程序中的“执行速度”会好于没有指针。我能解决的问题是:

  • 取消引用单个位置需要两次(或更多次)内存访问(取决于间接数)。与直接使用相比,这将增加执行时间。

  • 将指向大型数据类型的指针传递给函数,就像结构一样可能是有益的,因为只有结构/联合的地址被复制并且它不会被值传递。因此,在这种情况下应该更快。

例如,只需强制引入指针而不需要:

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检查了汇编程序输出。指针版本有很多加载内存并存储除了直接方法之外的引用。

我错过了什么吗?

注意:问题与代码无关。代码只是一个例子。不考虑编译器优化。

4 个答案:

答案 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)

Mark Byers绝对是对的。你无法在这样简单的程序中判断指针的功能。它们用于优化内存管理和更快地执行程序,其中过度使用数据结构并且通过地址完成引用。 考虑当你启动一个程序时,它需要一些时间来加载,但是如果程序加载甚至提前1秒这是一个很大的成就,那么有效地使用指针和技能。