6

いくつかのブログやサイトは、ポインターが有益であると話していました。原因の1つは、ポインターがないプログラムよりもポインターがあるプログラムの方が「実行速度」が優れているためです。私が解決できることは次のとおりです。

  • 単一の場所を間接参照するには、2つ(またはそれ以上)のメモリアクセスが必要です(間接参照の数によって異なります)。これにより、直接使用した場合と比較して、実行時間が長くなります。

  • 構造体/共用体のアドレスのみがコピーされ、値によって渡されないため、構造体などの関数への大きなデータ型へのポインターを渡すことは有益な場合があります。したがって、この場合は高速になるはずです。

たとえば、次のように、ポインタを強制的に導入する必要はありません。

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

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

それを除けば、あなたの理解は正しいです。

于 2012-12-20T08:17:05.607 に答える
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

マークバイアーズは絶対に正しいです。このような単純なプログラムでは、ポインタの能力を判断することはできません。ポインタは、メモリ管理を最適化し、データ構造が過度に使用され、アドレスを介して参照が行われるプログラムの実行を高速化するために使用されます。プログラムを開始するときは、ロードに時間がかかることを考慮してください。ただし、プログラムが1秒早くロードされる場合は、ポインターとスキルを効率的に使用することで、大きな成果が得られます。

于 2012-12-20T08:30:59.377 に答える