3

私は最近、「効率的な」逆シリアル化のために初期化されていない変数の透過性 (コンパイラ間で一般的な未定義の動作?) を利用する、かなり興味深いシリアル化アプローチに出くわしました。

メモリが割り当てられ、所定の値が割り当てられます。その後、配置 new を使用して構造体 (複雑なインプレース データ構造など) をインスタンス化し、初期化されていない変数を基礎となるメモリの値に「初期化」します。(以下のコードを参照)

それに加えて、かなり危険で、おそらくあまり快適なコーディング規則ではない可能性があります...誰かがこの方法に出くわしたのか、それとももっと重要なことに、それは何と呼ばれているのか疑問に思っていました.

class SomeClass {
public:
  SomeClass() {}

  int someInt;
};

int main(...) {
  int dummy = 42;

  int *pSomeClass = new (&dummy) SomeClass();
  cout << pSomeClass->someInt << endl;
}

これにより、番号 42 が出力されます... ニート!

4

2 に答える 2

5

それは「UBに頼る」というか、平たく言えば「馬鹿げたこと」です。

于 2011-11-01T08:22:10.890 に答える
2

RTOS である eCos で、カーネル オブジェクトの一部を初期化するためにこれが行われるのを見てきました。

Tomalak が指摘したように、欠点の 1 つは仮想関数が許可されていないことです。彼らは、等しいサイズをテストすることによって、それを確実にしようとしますsizeof(kernel object) == sizeof(variable used for initialization)

彼らのコードは、C関数を使用してC++クラスの変数を取得/設定する代わりに、CインターフェースのC++クラスメンバー変数を模倣するためにC構造体を使用する方がはるかに複雑でした。

彼らが行った動作は正反対でしたが、コンストラクターに設定された C++ クラスの値を使用して、placement new.

私はこれを行うことについてはお勧めしません。

于 2011-11-01T10:43:38.277 に答える