2016-05-07 16 views
1

私はクリティカルパスの関数を使って作業しています。コードはそのようになっていますPOD配列の最初の要素を初期化し、残りの要素は初期化しません

void ProcessData(const byte* input, size_t size) 
{ 
    ALIGN_ARRAY(16) int32_t m0[2] = { ((const int32_t*)input)[0] }; 
    ALIGN_ARRAY(16) int32_t m1[2] = { ((const int32_t*)input)[1] }; 
    ... 
} 

最初の要素、m0[0]は、私が気に1です。 2番目の要素であるm0[1]は、スクラッチスペースであり、mがSIMDエンジンに出荷される前に整列しています。 m0[1]に値が設定されますが、初期化する必要はありません。

このコードは、すべてを最小限に抑えるため、その重要なのは、繰り返しベンチマーク結果に非常に影響力と呼ばれています。私はコードがより最適化されるかもしれないので、コンパイラが最初の要素を初期化できることを知りたい。

にはどうすれば最初の要素だけが初期化されていることを確認しないと、アレイ内の残りの要素は初期化されませんか?それも可能ですか?


この質問は、初期化は割り当てとは異なっていることを、私も承知しているInitialization of a normal array with one default valueStatic array initialization of individual elements in C++Array initialization with {0}, {0,}?

のような質問の反対です。 zero-, default- and value-initializationの詳細とPODがどのようにそれに影響を与えるかについて説明します。

+2

次のいずれか何かすべてを初期化しません。あなたの場合は、配列を初期化しないで、最初の要素に割り当てます。 –

+0

ありがとう@KerrekSB。私はそれを恐れていました。それが事実なら、あなたもその記録に答えることができます。 – jww

答えて

1

ない、それはバイトの種類があり、あなたはint32型にキャストされている、特にとして入力されているものを確認してください。あなたがx86プラットフォーム上にいる場合は、バックワード(エンディアン問題)がないか注意してください。

は、このようなものの、適切なキャストで何かを試してみてください。

void ProcessData(const byte* input, size_t size) 
{ 
    ALIGN_ARRAY(16) int32_t m0[2]; 
    m0[0]= = (const int32_t*)input)[0]; 
    ALIGN_ARRAY(16) int32_t m1[2]; 
    m1[0] = (const int32_t*)input)[1]; 
    ... 
} 
1

スタック割り当て配列では不可能です。 C++ 03であっても、イニシャライザリストから省略された要素は、デフォルトで初期化され(クラス型の場合)、または値が初期化されていない場合には初期化されます。いくつかのオプションがあります:

  1. アレイを初期化しないで、1つの要素を初期化します。
  2. クラスラッパーを使用します。
  3. シナリオをオーバーライドします。ここで

は、あなたがそれを行う可能性がある方法です。

const uint8_t input[...]; 

std::pair< int32_t*, std::ptrdiff_t > ms[...]; 

for (int i = 0; i < ...; ++i) 
{ 
    ms[i] = std::get_temporary_buffer<int32_t>(2); 
    std::copy((const int32_t*)input + i, (const int32_t*)input + i + 1, 
       std::raw_storage_iterator<int32_t*, int32_t>(ms[i].first)); 
} 
// later loop std::return_temporary_buffer(ms[...].first); at end of function