2012-12-20 23 views
6

ポインタのあるプログラムについて、ポインタなしのプログラムより "実行速度"が向上するため、ポインタに関する有益な情報があるブログやサイトがあります。単一の場所を間接参照すると、2が必要ですポインタと実行速度

  • (またはそれ以上)のメモリは、(間接の数に応じて)アクセス:私は仕事ができる事はということです。これは、直接使用された場合と比較して、実行時間を増加させます。

  • 構造体/共用体のアドレスだけがコピーされ、値渡しされないため、構造体のような大きなデータ型へのポインタを関数に渡すと効果的です。したがって、この場合は速くなるはずです。

    例えば

同じように必要とすることなく、ポインタを導入する力によって:私はgcc -S -masm=intel file.cポインタのバージョンを使用してアセンブラ出力を確認

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? 

はロードメモリをたくさん持っているし、直接よりも逆参照のために保存します方法。

何か不足していますか?

注:質問は単なるコードとは関係ありません。コードは単なる例です。コンパイラの最適化を考慮しません。

+1

「有益」または「より良い」は、あるものと他のものを比較する場合にのみ使用できます。ですから、質問は著者がexecutinのスピードを比較したものです。構造体を渡すことについて構造体ポインタを使用すると、ポインタはより速くなります - それぞれの構造体が頻繁に使用されない場合他のことに関しては、それは大きく依存する。 – glglgl

+0

最善のケースでは、関係する型がわかっている場合、コンパイラはすでに参照を解除することができるため、両方のバージョンが同等です。あなたの例を '-O2'でコンパイルし、ポインタがどのように最適化されているかを見てください。 – matthias

+0

コンパイラの最適化は考慮していませんが、主なポイントは、ポインタを使用すると、ある種の "魔法のような"理由で実行速度が向上するかどうかです。あるいは、ポインタは、メモリアドレスとして使用する整数を保持する通常の変数と考えるべきであり、いくつかの構文では、そのような値を保持するために使用するコンパイラ識別子を伝えます。 – phoxis

答えて

6

あなたの結論は基本的に正しいと思います。作者は、より多くのポインタを使用することは常にすべてのコードをスピードアップすることを意味しませんでした。それは明らかにナンセンスです。

しかし、そのデータをコピーするのではなく、データへのポインタを渡すほうが速い場合があります。

1

指摘したとおり:大きなデータ型へのポインタを関数に渡す;ここでは構造はintなので、それほど大きくはありません。ところで:gccは、-O2を使用すると、ポインタへのアクセスを最適化すると思います。

あなたの理解は間違いではありません。

+0

コンパイラの最適化を考慮していないので、単なる例です。それが関数の中にあると考えてください。 – phoxis

-1

Mark Byersは絶対に正しいです。このようなシンプルなプログラムでポインタの力を判断することはできません。データ構造の過度な使用やアドレスによる参照が行われるプログラムのメモリ管理と高速実行を最適化するために使用されます。 プログラムの起動時には、プログラムの読み込みに時間がかかりますが、プログラムが1秒早くロードされるとポインタやスキルを効率的に使用できるということは大きな成果です。

+0

問題は一般的に、コードは例でした。 – phoxis

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); 
関連する問題