我理解,通过联合,所有成员共享相同的内存。使用结构,它们不共享内存,因此内存中的不同空间被分配给结构的每个成员。
我的解决方案要求我创建一个只存储结构中存储的类型之一的值的结构;表现得像一个联盟。我不能使用union的原因是因为指定的“类型”之一是字符串,并且您不能在union中包含字符串变量。如何确保一次只有一个struct的成员占用内存中的空间?
答案 0 :(得分:8)
您需要一个缓冲区(大小为max(sizeof(T1), sizeof(T2), sizeof(T3)...)
),placement new和一个枚举变量来记住哪个对象当前在缓冲区中。它被称为"标记的联盟"。然后,您需要编写成员函数来安全地控制这个人工授精对象的生命周期。最后,您需要花几天时间来解决任何对齐要求。
但这是boost::variant
所做的,所以就这样使用它。它很快就会std::variant
。
答案 1 :(得分:0)
如何确保结构中只有一个成员一次占用内存空间?
如果您的编译器(C ++ 17)支持,您可以使用std::any
或std::variant
,或者您可以为您的类型设置模板
template <typename T>
struct wrap
{
T elem;
};
答案 2 :(得分:-3)
你做不到。结构总是大小相同。创建结构时,编译器会为结构中的每个成员变量保留空间,并将其定义为结构的大小。当您的代码要求内存管理器为结构分配内存时,无论是否使用所有变量,它都将始终分配相同数量的内存。
最好的办法是将字符串转换为可以在联合中使用的另一种类型,例如固定大小的字符数组。