1

我有一个简单的问题,即仅使用指针而不是普通变量是否会在时间方面或内存方面提高程序的效率?例如,如果我使用以下程序交换两个整数。

#include<iostream>
#include<conio.h>
#include<new>
using namespace std;
int main()
{
   int *a=new int;
   int *b=new int;
   int *c=new int;
   cin>>(*a)>>(*b);
   *c=*a;*a=*b;*b=*c;
   cout<<"swapping";
   cout<<*a<<*b;
getch();
}
4

4 回答 4

9

使用指向变量的指针而不是变量不太可能提高性能。尽可能以最清晰的方式编写代码,让编译器为您优化代码。如果有的话,使用指针可能会减慢速度,因为它会使编译器分析更加困难。

对于大型对象,值得保留指向对象的指针而不是复制这些对象。也许这就是你错误推断的真相的核心。

于 2012-11-10T06:23:31.390 回答
4

在上面给出的示例中,无论是时间方面还是内存方面,它的效率都较低。

  • 动态分配比局部变量花费更多的时间(有函数调用和要完成的工作,局部变量是通过从堆栈指针中减去创建的,通常只对所有局部变量进行一次操作)。
  • 动态分配比局部变量消耗更多的内存(内存管理器中有支持的数据结构)。

当指针用于防止复制大型结构时,指针可以使程序更高效。ints 不属于这一类。

于 2012-11-10T06:24:50.687 回答
3

我能想到的唯一可能使使用指针比使用局部变量更慢的是生成的程序集可能涉及更复杂的内存寻址,从而导致更大的机器操作码,而这反过来会花费很少更多的时间来执行。

尽管你不应该担心它,但那个时差可以忽略不计。

您应该考虑的是堆栈上的分配比堆上的分配要快得多。换句话说:

int* a = new int;

慢于:

int a;

但只是因为分配new int,而不是因为您使用的是指针。

于 2012-11-10T06:28:01.350 回答
0

此代码在您编写它的级别上几乎没有任何作用。如果您在指令级别单步执行它,您会看到每次调用都会new执行 100 条指令,而且cout <<调用执行的次数还要多得多。

这就是你要测量的。

于 2012-11-10T19:24:51.490 回答