3

我最近遇到了一种相当有趣的序列化方法,它利用未初始化变量的透明度(编译器之间常见的未定义行为?)来“高效”反序列化。

内存被分配和分配一个预定的值。然后使用放置 new 来实例化一个结构(例如复杂的就地数据结构),将未初始化的变量“初始化”为底层内存的值。(见下面的代码)

除了相当冒险并且可能不是一个非常令人满意的编码约定之外......我只是想知道是否有人遇到过这种方法或更重要的是 - 它叫什么?

class SomeClass {
public:
  SomeClass() {}

  int someInt;
};

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

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

这将打印出数字 42...neato!

4

2 回答 2

5

这就是所谓的“靠UB”,或者通俗地说,是“愚蠢”。

于 2011-11-01T08:22:10.890 回答
2

我已经看到在 eCos(一个 RTOS)中这样做了,以初始化它们的一些内核对象。

正如 Tomalak 所指出的,缺点之一是不允许使用虚拟函数。他们试图通过测试来确保大小相等sizeof(kernel object) == sizeof(variable used for initialization)

他们的代码虽然使用 C-struct 来模拟 c 接口的 C++ 类成员变量而不是使用 C 函数来获取/设置 C++ 类中的变量,但要复杂得多

尽管他们在那里的行为完全相反,但他们使用 C++ 类中的值(在构造函数中设置)来填充placement new.

我不建议这样做。

于 2011-11-01T10:43:38.277 回答