2017-05-08 6 views
-2

私はいくつかの固定長配列を持ち、それらを比較したいと思っています。C++の生メモリを比較することは可能ですか?

struct Foo 
{ 
    /// the data, not necessarily int and not necessarily length 32 
    int val[32]; 

    /// simple way 
    inline bool compare1(const NAME_CELL & rhs) const 
    { 
     for (unsigned int ui = 0; ui < 32; ++ui) 
     { 
      if (val[ui] != rhs.val[ui]) 
      { 
       return false; 
      } 
     } 
     return true; 
    } 

    /// compare memory directly instead of using a loop. Is this faster? 
    inline bool compare2(const NAME_CELL & rhs) const 
    { 
     return memcmp(val, rhs.val, 32 * sizeof(int)) == 0; 
    } 
}; 

compare1は、比較2よりも遅く、速く、等しいか?もっと速い方法がありますか?あなたがvalの要素をを初期化しました場合を除き

+0

私はあなたが 'memcmp'を意味すると思いますか? –

+0

また、あなたのタイトルには "C"と書かれていますが、この "C++"とタグ付けされています - これはあなたの話ですか? –

+0

ありがとう、タイトルを修正しました。私の質問はC開発者にも関係するかもしれませんが、私はC++を使用しています。 – Fabian

答えて

2

その後、方法のいずれかの動作は、標準C++で未定義です。

代わりに、適切な最適化を行うためにコンパイラを信頼することをお勧めします。しかし、まだ疑問がある場合は、(i)パフォーマンスをプロファイルし、(ii)生成されたアセンブリを確認してください。& c。

+0

再初期化:なぜ動作は未定義ですか?ヴァルの内容は、しかし行動ですか? – James

+1

'int'はトラップ表現を含むことができます。 'unsigned char'配列は問題ありません。 http://stackoverflow.com/questions/11962457/why-is-using-an-uninitialized-variable-undefined-behavior-in-cを参照してください。確かに、それはCでタグ付けされていますが、良い出発点です。 – Bathsheba

+0

もちろん、それらを比較する前にFoosを初期化する必要があります。これに言及する必要はありません。 – Fabian

関連する問題