1

通常の変数の代わりにポインターのみを使用すると、プログラムの効率が時間的にもメモリ的にも向上するかという簡単な質問があります。たとえば、次のプログラムを使用して 2 つの整数を交換するとします。

#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

上記の例では、時間的にもメモリ的にも効率が低くなっています。

  • 動的割り当ては、ローカル変数よりも時間がかかります(関数呼び出しと実行する作業があり、ローカル変数はスタックポインターから減算することによって作成されます。多くの場合、すべてのローカル変数に対して1つの操作だけです)。
  • 動的割り当ては、ローカル変数よりも多くのメモリを消費します(メモリマネージャにはサポートされているデータ構造があります)。

ポインタを使用すると、大きな構造体のコピーを防ぐためにプログラムをより効率的にすることができます。intsはこのカテゴリに分類されません。

于 2012-11-10T06:24:50.687 に答える
3

ローカル変数を使用するよりもポインタの使用が遅くなる可能性があると私が考えることができる唯一のことは、生成されたアセンブリがより複雑なメモリアドレス指定を含む可能性があり、その結果、マシンのオペコードが大きくなり、その結果、少し時間がかかることです。実行する時間が長くなります。

その時差はごくわずかですが、心配する必要はありません。

考慮すべきことは、スタックへの割り当てはヒープへの割り当てよりもはるかに高速であるということです。言い換えると:

int* a = new int;

より遅い:

int a;

new intただし、ポインタを使用しているためではなく、割り当てのためだけです。

于 2012-11-10T06:28:01.350 に答える
0

このコードは、記述したレベルではほとんど何もしません。命令レベルでステップスルーすると、各呼び出しnewが数百の命令を実行し、cout <<呼び出しがさらに多くのことを実行することがわかります。

それがあなたが測定しているものです。

于 2012-11-10T19:24:51.490 に答える