我知道std :: variant更易于使用,通常也更方便,但实际上哪个更快?
答案 0 :(得分:-3)
union
可能比std::variant
有两种非常简单的方法可以了解这种情况。对于初学者来说,std::variant
在设计上比具有完全相同元素的union
稍大。因此,在非常深奥的使用条件之外,任何涉及复制数据,移动数据等操作都不会比union
快。
最重要的是,std::variant
是经过类型检查的,而union
不是。因此,对union
中包含的元素执行相同的代码将比对std::variant
进行操作更快。
话虽如此,但作为程序员可能会将事情搞砸。例如,对union
进行类型检查的理想方法是执行以下操作:
struct my_union {
union {
int i;
double a;
std::string s;
};
size_t index;
//...
};
int main() {
my_union u;
u.i = 15;
u.index = 0;
if(u.index == 0) {
std::cout << u.i;
} else if(u.index == 1) {
std::cout << u.a;
} else if(u.index == 2) {
std::cout << u.s;
}
std::cout << std::endl;
}
至少在大小和布局方面,它与std::variant
的实现方式没有什么不同,并且可能比std::visit
模式的std::variant
慢或快{1}},具体取决于编译器的智能程度。
但是作为程序员,您的用例可能有所不同,或者您的约束可能有所不同,或者代码本来应该有所不同,但后来被编辑为其他形式。无论如何,用于手动对union
进行类型检查的代码(假设程序员甚至还记得这样做,并且不会因忽略而搞砸!)可能不是那么优雅或正确。 / p>
是的,由于很多原因,union
可能比std::variant
快。但是,如果您尝试编写安全,可维护的代码,则应该使用std::variant
。