【发布时间】:2020-06-08 16:46: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;
}
【问题讨论】:
-
sizeof(std::string)永远不会改变。另请参阅:stackoverflow.com/questions/40106941/… -
确实,您可能会惊讶地发现
sizeof(std::string)始终相同,无论该字符串为空还是包含所有哈利波特书籍的全部内容。 -
是不是因为容器字符串有一些指向字符串实际数据的指针?
-
实际上,是的。
std::vector和所有其他容器也是如此。 C++ 中所有对象的大小永远不会改变。这是基本的,std::string为您正确管理所有内存。容器也是如此。这就是为什么现代 C++ 代码很少需要使用new或delete。 -
是的,确实如此。当联合包含非 POD 时,您有责任按顺序正确地构造和销毁联合成员,一次一个。但是,如何将这种头痛强加给自己?只需使用
std::variant,它也会为您完成所有这些工作。