2012-09-13 1 views
6

以下のサンプルコードでは、構造体Chunkのインスタンスをいくつか割り当てます。 forループでは、私はメモリブロックを繰り返し、ポインタまたは参照のいずれかを使用して異なるインスタンスにアクセスし、いくつかのランダムなデータを割り当てます。ポインタアクセスまたは参照アクセスが高速ですか?

しかし、forループは最も速く実行されますか?私の知る限りでは、参照ループは、逆参照を必要とせず、メモリ内のインスタンスに直接アクセスできるため、参照ループが最も速くなると言います。どのように間違っている/私は右ですか?

struct Chunk { 
    unsigned int a; 
    float b; 
    const char* c; 
}; 

int main() { 
    Chunk* pData = new Chunk[8]; 

    for(unsigned int i = 0; i < 8; ++i) { 
     Chunk* p = &pData[i]; 
     p->a = 1; 
     p->b = 1.0f; 
     p->c = "POINTERS"; 
    } 

    for(unsigned int i = 0; i < 8; ++i) { 
     Chunk& r = pData[i]; 
     r.a = 1; 
     r.b = 1.0f; 
     r.c = "REFERENCES"; 
    } 

    delete [] pData; 
    return 0; 
} 
+7

あなたのコンパイラに依存しますが、鉱山ではまったく同じコードにコンパイルされます。ほとんどのC++開発者は、スタイルの問題として参照を優先します。 –

+0

参照は自動的に参照解除されたポインタのようなものです。 – tadman

+0

@tadman標準に準拠していません。 –

答えて

10

これらは、イディオイ以外のコンパイラと同じ(同じではないが、まったく同じ)である必要があります。フードの下では、参照ポインタ(コンパイラの99%)です。違いはありません。

Pedantic:第2ループは、データがすでにキャッシュに入っているので、より速く(たぶん)ないかもしれませんが、それだけです。 :)

+0

downvoteについての説明は? –

+0

おそらくCの狂信者は、アンカーザンダーよりも良い矢を好んでいます。 – tadman

+2

100%正確ではありません。参照はポインタではなく、オブジェクトではありません。いくつかのケースではポインタで実装できますが、100%ではありません。また、ポインタと参照用に生成されたコードは異なる場合があります。 – Rost

1

適切なコンパイラによって生成されるコードに違いはないはずです。

1

あなたの例のコードのような2つのバージョンのコードの間に躊躇したときは、もう1つのコードを選択してください。あなたが提案する種類の最適化は、コンパイラによって行われることになっています。

あなたのケースでもっと読みやすいのは、参照付きのバージョンです(実際にはもっと読みにくいかもしれませんが、ポインタはより危険なので参照の使用を優先します)。

しかし、(もし誰かがアセンブラを知っていれば読んでほしい、笑い攻撃を受けるのであれば...)私の意見では、pDataがヒープ上に配置されると、コンパイラはそれをコンパイルする必要がありますとにかくポインタを使用します。私はあなたの推論があなたの構造がちょうど "Chunk data [8];"でスタックに割り当てられていれば正直なものかもしれないと思う。しかし、遅くともコンパイラの最適化が行われているときには、その差はとにかく削除する必要があります。

1

私は言いたくなります:誰が気にしますか?速度の差はごくわずかですが、 となり、最も読みやすいものを選択する必要があります。この具体的なケースでは、 の場合、同じコードが両方とも のケースで生成されていることが予想されます。より複雑なケースでは、コンパイラはポインタが再配置されていないことを後でループで確認することができず、 を再読しなければならないことがあります。しかし、この場合には、 の違いを測定できないほど充分なことをしなければなりません。

+0

ありがとうございます。これは実際の世界の例ではありません。私は、もっと複雑なシナリオで何を選ぶべきかと思っています。 –

+0

@MichaelMancillaあなたがしたいことを最もよく表している方。可能であれば一般的に参照し、それ以外の場合はポインタを使用します。参照を使用すると、参照されるオブジェクトが変更されないことを読者(およびコンパイラ)に伝えます。 –

+0

"速度の差はごくわずかです。"あなたのユースケースは誰かではありません。 – easytiger

関連する問題