[解決済み] 構造体をゼロにするためにmemset()または値の初期化?
質問
Win32 API のプログラミングでは、通常 C
struct
を使用するのが一般的です。通常、そのうちの2つだけが意味のある値を持ち、他のすべてはゼロにする必要があります。これは2つの方法のどちらかで実現できます。
STRUCT theStruct;
memset( &theStruct, 0, sizeof( STRUCT ) );
または
STRUCT theStruct = {};
2つ目のバリエーションはよりクリーンな印象を与えます。これはワンライナーで、ミスタイプしてエラーを引き起こす可能性のあるパラメータを持ちません。
最初のバリエーションと比較して何か欠点はありますか?どの変種を使うか、そしてその理由は?
どのように解決するのですか?
この2つのコンストラクトは
は非常に
はその意味において異なっています。最初のものは
memset
関数で、これは
メモリのバッファを特定の値に設定する
. 2番目の
オブジェクトを初期化する
. ちょっとしたコードで説明しましょう。
構造体があるとします。 POD型のみ ("Plain Old Data" - を参照してください。 C++のPOD型とは何ですか? )
struct POD_OnlyStruct
{
int a;
char b;
};
POD_OnlyStruct t = {}; // OK
POD_OnlyStruct t;
memset(&t, 0, sizeof t); // OK as well
この場合
POD_OnlyStruct t = {}
または
POD_OnlyStruct t; memset(&t, 0, sizeof t)
の違いだけなので、大きな違いはありません。
アライメント
の場合、バイトがゼロに設定されることです。
memset
が使用されます。通常、これらのバイトにアクセスすることはないため、あなたにとって違いはありません。
一方、質問にC++とタグ付けされているので、別の例を試してみましょう。 型が POD と異なる :
struct TestStruct
{
int a;
std::string b;
};
TestStruct t = {}; // OK
{
TestStruct t1;
memset(&t1, 0, sizeof t1); // ruins member 'b' of our struct
} // Application crashes here
この場合、以下のような式を使用します。
TestStruct t = {}
がよくて
memset
を使うとクラッシュします。以下は、もし
memset
- 型のオブジェクトを
TestStruct
のオブジェクトが作成され、その結果、型
std::string
型のオブジェクトが作成されます。次に
memset
はオブジェクトが存在するメモリを設定します。
b
が置かれていたメモリを特定の値、例えばゼロに設定します。さて、TestStructオブジェクトがスコープの外に出ると、それは破壊されることになります。そして、そのメンバーである
std::string b
のメンバーである memset
.
というわけで、現実は
これらのことは非常に異なっています。
であり、時には
memset
をゼロにする必要がある場合もありますが、常に自分が何をしているかを理解し、2番目の例のような間違いを犯さないようにすることが重要です。
私の投票 - 使用する
memset
を使う。
のみ
が必要な場合は
デフォルト
初期化
x = {}
を、それ以外の場合は
関連
-
[解決済み】Visual Studio 2015で「非標準の構文; '&'を使用してメンバーへのポインターを作成します」エラー
-
[解決済み】エラー。switchステートメントでcaseラベルにジャンプする
-
[解決済み] ArrayListの初期化を1行で行う。
-
[解決済み] C++でクラスと構造体はいつ使い分けるべきか?
-
[解決済み] 配列のすべてのメンバーを同じ値で初期化するには?
-
[解決済み] C++の'struct'と'typedef struct'の違い?
-
[解決済み] .NETにおけるstructとclassの違いは何ですか?
-
[解決済み] 構造体のsizeofは、なぜ各メンバーのsizeofの合計と等しくないのですか?
-
[解決済み] C言語標準に準拠した構造体の初期化方法
-
[解決済み】Javaの「ダブルブレース初期化」の効率化?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】coutはstdのメンバではない
-
[解決済み】クラステンプレートの引数リストがない
-
[解決済み】致命的なエラー LNK1169: ゲームプログラミングで1つ以上の多重定義されたシンボルが発見された
-
[解決済み】 != と =! の違いと例(C++の場合)
-
[解決済み】変数 '' を抽象型 '' と宣言できない。
-
[解決済み] クラスにデフォルトコンストラクタが存在しない。
-
[解決済み】C++プログラムでのコンソールの一時停止
-
[解決済み】#include<iostream>は存在するのですが、「識別子 "cout "は未定義です」というエラーが出ます。なぜですか?
-
[解決済み】クラスのコンストラクタへの未定義参照、.cppファイルの修正も含む
-
[解決済み] C++のPOD型とは何ですか?