9

クラスのパディング バイトを 0 に設定したいのは、インスタンスをバイト レベルで保存/読み込み/比較/ハッシュしているためです。

私はこれが私が望むものを達成することを知っています(自明にコピー可能な型の場合):

struct Example
{
    Example(char a_, int b_)
    {
        memset(this, 0, sizeof(*this));
        a = a_;
        b = b_;
    }
    char a;
    int b;
};

私はそれをするのが好きではありません.つまり、すべて 0 ビットです)。

余談ですが、明らかに自明にコピー可能な型に限定されていますが、上記の操作 (バイトレベルでの読み込み/保存/比較/ハッシュ) には自明にコピー可能な型が必要なので、それは私にとっては問題ではありません。

私が欲しいのは、この[魔法の]スニペットのようなものです:

struct Example
{
    Example(char a_, int b_) : a(a_), b(b_)
    {
        // Leaves all members alone, and sets all padding bytes to 0.
        memset_only_padding_bytes(this, 0);
    }
    char a;
    int b;
};

私はそのようなことが可能であるとは思わないので、誰かが醜くない代替案を提案できるなら...私はすべての耳です:)

4

3 に答える 3

7

純粋な C++ でこれを完全に自動的に行う方法を私が知っている方法はありません。これを実現するために、カスタム コード生成システムを使用します (特に)。これは、すべてのメンバー変数名を与えたマクロで実現できる可能性があります。offsetof(memberA)+sizeof(memberA) と offsetof(memberB) の間の穴を探すだけです。

または、バイナリ BLOB としてではなく、メンバーごとにシリアル化/ハッシュします。それが10種類のクリーナーです。

operator newああ、もう1つのオプション-メモリを返す前に明示的にクリアする を提供できます。私はそのアプローチのファンではありませんが.....スタック割り当てには機能しません。

于 2013-10-23T15:13:51.590 に答える
2

私は同様の問題に直面しました-そして、ハッシュコードを制御できない可能性があるため(私の場合は外部ライブラリを使用していた)、これは設計上の決定が悪いと単純に言うだけでは必ずしも役に立ちません(dasblinkenlightのコメントによる)。

1 つの解決策は、クラスのカスタム イテレータを作成することです。このイテレータは、データのバイトを繰り返し処理し、パディングをスキップします。次に、ポインタの代わりにカスタム イテレータを使用するようにハッシュ アルゴリズムを変更します。これを行う簡単な方法の 1 つは、反復子を使用できるようにポインターをテンプレート化することです。ポインターと反復子のセマンティクスは同じであるため、テンプレート化以外のコードを変更する必要はありません。

EDIT : Boost は、コンテナにカスタム イテレータを簡単に追加できる素敵なライブラリを提供します: Boost.Iterator

どちらのソリューションを使用する場合でも、ハッシュ アルゴリズムがデータ構造と高度に結合されていることを意味するため、パディングのハッシュを回避することを強くお勧めします。データ構造を切り替えると (または Agent_L が言及したように、別のプラットフォームで同じデータ構造を使用して異なるパディングを行う)、異なるハッシュが生成されます。一方、実際のデータ自体のみをハッシュすると、後で使用するデータ構造に関係なく、常に同じハッシュ値が生成されます。

于 2013-10-23T15:29:35.387 に答える