Union或std :: variant <>哪个更快?

时间:2019-07-11 14:09:49

标签: c++ c++17

我知道std :: variant更易于使用,通常也更方便,但实际上哪个更快?

1 个答案:

答案 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