gpt4 book ai didi

c++ - 对象 union 与指针 union

转载 作者:行者123 更新时间:2023-11-27 22:58:28 29 4
gpt4 key购买 nike

如果我有两个 union 行结构:

struct A {
A() {}
~A() {}
union {
vector<int> vi;
vector<double> db;
};
};

struct B {
union {
vector<int> * vi;
vector<double> * db;
};
};

我知道我必须以不同的方式与他们合作,例如:

A a;
new (&a.vi) vector<int>;

对比

B b;
b.vi = new vector<int>();

除此之外,将第一种方法(unrestricted union)用于第二种方法(仅保存指向当前 vector 的指针)是否有任何优势?或者它们在功能和性能方面是否相同,唯一不同的是我如何使用它们?

编辑:原始代码是没有编译的极简示例,我在 A 结构中添加了 A() {}~A() {} 来制作它正确且可编译。

最佳答案

I added A() {} and ~A() {} in A struct to make it correct and compile-able.

添加构造函数和析构函数使您的代码可编译,但并没有使其正确。原始示例中固有的问题仍然存在:编译器不知道如何处理 union 背后的内存。

两个 vector 都管理自己的内存。 vi 管理指向 int 的指针,而 db 管理指向 double 的指针。两个 vector 都放在内存中的同一位置,因此它们的指针是共享的。当分配、复制或销毁 A 时,编译器不知道调用哪个函数 - A::viA::数据库

虽然您可能可以通过为资源管理定义所有特殊函数(构造函数/复制构造函数/移动构造函数/析构函数)来使其工作,但这是一个非常重要的练习,会导致非常脆弱的代码。问题在于,每次向 union 添加新成员时,代码都必须更改,但编译器无法提醒您。旧代码可以编译,但是一旦您分配新成员并复制包含它的 union ,它就会导致未定义的行为。

关于c++ - 对象 union 与指针 union ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30163038/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com