只使用一个成员的联合的目的是什么?

dao*_*ker 64 c++ unions c++14

当我阅读seastar源代码时,我注意到有一个称为tx_side只有一个成员的联合结构。这是解决某些问题的技巧吗?

仅供参考,我将tx_side以下结构粘贴:

union tx_side {
    tx_side() {}
    ~tx_side() {}
    void init() { new (&a) aa; }
    struct aa {
        std::deque<work_item*> pending_fifo;
    } a;
} _tx;
Run Code Online (Sandbox Code Playgroud)

Hol*_*Cat 61

因为tx_side是联合,tx_side()所以不会自动初始化/构造a~tx_side()也不会自动对其进行破坏。这样可以通过放置新的和手动的析构函数调用(可怜的人)对a和的生命周期进行细粒度的控制。pending_fifostd::optional

这是一个例子:

#include <iostream>

struct A
{
    A() {std::cout << "A()\n";}
    ~A() {std::cout << "~A()\n";}
};

union B
{
    A a;
    B() {}
    ~B() {}
};

int main()
{
    B b;
}
Run Code Online (Sandbox Code Playgroud)

在此,不B b;打印任何内容,因为a既不构造也不破坏。

如果BstructB()将调用A(),然后~B()调用~A(),那么您将无法避免这种情况。

  • @daoliker不一定是随机的,但您无法预测。与任何其他未初始化的变量相同。您不能假设它是随机的。您所知道的所有信息都可以保留您之前要求他们输入的用户密码。 (21认同)
  • @JackAidley:哪个确切的说法?您确实有很好的联系,似乎我把故事倒了。OpenSSL弄错了逻辑,并使用了未初始化的变量,从而使编译器可以合法地承担任何结果。Debian正确地发现了这一点,但解决了问题。至于“编译器做出这样的错误决定”;他们没有做出决定。未定义行为是错误的决定。优化器旨在在正确的代码上运行。例如,GCC主动假定没有签名的溢出。假设“没有未初始化的数据”同样合理;它可以用来消除不可能的代码路径。 (4认同)
  • @daoliker:以前的评论太乐观了。随机字节的取值范围为0-255,但是如果您将未初始化的字节读入int,则可能会得到0xCCCCCCCC。读取未初始化的数据是未定义的行为,并且可能发生的情况是编译器只是放弃了该尝试。这不仅仅是理论。Debian犯了这个确切的错误,它破坏了他们的OpenSSL实现。他们有一些实际的随机字节,添加了一个未初始化的变量,编译器说“结果是不确定的,所以它很可能为零”。零显然不再是随机的。 (3认同)