c++ - 使用只有一个成员的工会的目的是什么?
问题描述
在阅读seastar 源代码时,我注意到有一个名为 union 的结构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;
解决方案
因为tx_side
是一个联合,tx_side()
不会自动初始化/构造a
,~tx_side()
也不会自动破坏它。这允许通过放置新和手动析构函数调用(穷人的)对a
and的生命周期进行细粒度控制。pending_fifo
std::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;
}
在这里,不B b;
打印任何内容,因为a
既不构造也不破坏。
如果B
是 a struct
,B()
将会调用A()
,并且~B()
会调用~A()
,并且您将无法阻止这种情况。
推荐阅读
- php - 如何组合成单个变量数组
- java - 如何检查函数是否第一次运行?
- alm - 使用 python 从 ALM OTA 获取用户字段
- android - 无法使用提供的参数调用 requestLocationUpdates()
- css - 多个框阴影在 MSEdge 中不起作用
- javascript - 用于设置 CSS 属性的变量属性
- react-native - 无法在 Salesforce Lightning Chatter 页面 iOS web 视图中打开附件
- r - ggplot2 中小中断的较短刻度线
- java - 运行多个服务时如何只获取一个 Redis 事件?
- haskell - 为什么 main 的 return 不是退出代码?