6

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

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

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

例如,只需强制引入指针而无需任何需要:

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

4 回答 4

6

我觉得你的结论基本是对的。作者并不是说使用更多的指针总是会加快所有代码的速度。这显然是无稽之谈。

但是有时传递指向数据的指针而不是复制该数据会更快。

于 2012-12-20T07:59:57.860 回答
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 );
于 2012-12-21T10:44:31.183 回答
1

正如您所指出的:将指向大型数据类型的指针传递给函数;这里的结构是 a int,所以它几乎不大。顺便说一句:我猜 gcc 会在您使用 -O2 时优化指针访问。

除此之外,您的理解是正确的。

于 2012-12-20T08:17:05.607 回答
-1

马克拜尔斯是绝对正确的。在这样一个简单的程序中,你无法判断指针的威力。指针用于优化内存管理,加快程序的执行速度,在过度使用数据结构和通过地址完成引用的情况下。考虑当你启动一个程序时,它需要一些时间来加载,但如果程序提前 1 秒加载,那么可以有效地使用指针和技能,这是一个很大的成就。

于 2012-12-20T08:30:59.377 回答