C++:抽象联合和新放置运算符的行为?

C++: Behavior of abstract union and new placement operator?

本文关键字:运算符 新放 抽象 C++      更新时间:2023-10-16

据我所知,union的大小是该联盟中最大的成员。 有谁知道将非固定大小的容器(如string(添加到联合时的行为? 尺寸是多少? 此外,使用新的放置操作时,大小如何变化? 谢谢!

下面是一个示例:

#include <string>
using namespace std;
class X {
public:
union {
int i;
string s;
};
X(string ss) { new(&s) string{ss}; };
~X() { s.~string(); };
};
int main(int argc, char *argv[])
{
X xx{"abc"};
return 0;
}

我的理解是工会的规模是该工会中最大的成员。

不完全是。如果一个成员具有更严格的对齐要求,而另一个成员较大,但不是上述对齐的倍数,则联合的总大小可能大于任一成员。

有谁知道当非固定大小的容器时工会的行为

C++中没有非固定大小类型。所有类型都有一个编译时常量大小。动态容器从免费存储中分配内存,并使用恒定大小的指针间接引用该内存。

尺寸是多少?

它正好是sizeof(X)个字节。

此外,使用新的放置操作时,大小如何变化?

它不会改变。

sizeof(std::string(总是相同的,无论字符串是空的还是包含字符串的。 需要新的放置运算符的唯一原因是联合中存在字符串,因为字符串和 int 之间共享存储。