4
typedef struct {  
double firstArray[3];
double secondArray[4][4];
bool   thirdArray[2];    
} myStruct;

を使用して、配列のすべての値を1行でゼロに初期化できることを理解していますint myArray[10] = { 0 };

myStruct の配列のすべての要素をゼロおよび false (bool の場合) に初期化する関数があります。

void initializeElementsOfStruct(myStruct* str)
{
str->firstArray[0] = 0.0;
str->firstArray[1] = 0.0;
str->firstArray[2] = 0.0;
...
}

上記または for ループを使用する代わりに、1 つのライナーでそれを行うにはどうすればよいですか?

編集: 構造体には非プリミティブ データ型も含まれる場合があります。

4

3 に答える 3

7

構造体はプリミティブ型のみで構成されているため、メモリ表現全体をゼロに設定して、目的の効果を得ることができます。(これにより、メンバー単位のアプローチでは書き込みを行わないパディング バイトが上書きされる可能性がありますが、実際には最終的にはより効率的になる可能性があります。)

C:

#include <string.h>

memset(str, 0, sizeof *str)

C++ の場合:

#include <algorithm>

std::fill(reinterpret_cast<char*>(str),
          reinterpret_cast<Char*>(str) + sizeof *str, 0);
于 2013-09-19T12:48:55.383 に答える
3

C89/90 と下位互換性のある慣用的な解決策は、

void initializeElementsOfStruct(myStruct* str)
{
  const myStruct ZERO = { 0 };
  *str = ZERO;
}

「愚かな」コンパイラの場合、 (パフォーマンスが重要なコードで)ZEROとして宣言するのが理にかなっています。static

C99では、簡単に行うことができます

void initializeElementsOfStruct(myStruct* str)
{
  *str = (myStruct) { 0 };
}

かなり同等の C++ バージョン (C++ 固有の初期化セマンティクスを認識している) は次のようになります。

void initializeElementsOfStruct(myStruct* str)
{
  *str = myStruct();
}
于 2013-09-30T15:38:44.390 に答える
1

C++11 では、次のようなヘルパー関数を定義できます。

#include <cstring>
#include <type_traits>

template<typename T,
         typename = typename std::enable_if<std::is_pod<T>::value, T>::type>
void zero_initialize(T &x) {
  std::memset(&x, 0, sizeof(x));
}

POD タイプに対してのみ機能し、それ以外の場合はコンパイルに失敗します。

void initializeElementsOfStruct(myStruct* str) {
  zero_initialize(*str);
}
于 2013-09-30T17:41:14.317 に答える