简体   繁体   English

容器模板参数性能对比?

[英]Performance comparison about template parameters of container?

I am developing an application that holds a vector of different types, like below我正在开发一个包含不同类型向量的应用程序,如下所示

#include <vector>
#include <variant>
#include <any>

class Symbol{};
class Terminal : public Symbol{
    Token token;
};
class NonTerminal : public Symbol{};

Terminal main(){
    std::vector< std::any > vec1 = {Terminal(), NonTerminal()};                           // 1
    std::vector< std::variant<Terminal,NonTerminal> > vec2 = {Terminal(), NonTerminal()}; // 2
    std::vector<Symbol> vec3 = {Terminal(), NonTerminal()};                               // 3
}

where, Terminal and NonTerminal are derived classes of Symbol , from the basic theory of context-free language.其中, TerminalNonTerminalSymbol派生类,来自上下文无关语言的基本理论。 Among the three vectors, Which is the fastest one, consider iterating the elements?在三个向量中,哪个最快,考虑迭代元素?

A critical problem is that the derived class Terminal holds an additional member variable token .一个关键问题是派生类Terminal持有一个额外的成员变量token An alternative implementation (my collegue's idea) would be something like below,另一种实现(我同事的想法)如下所示,

#include <vector>

class Symbol{
    bool isTerminal; // to differentiate Terminal and NonTerminal
    Token token;
};

Terminal main(){
    std::vector<Symbol> vec;
}

How about this?这个怎么样?

They do different things, so it is meaningless to say which is faster.他们做不同的事情,所以说哪个更快是没有意义的。

vec1 discards the type information, so you have to remember that you put in Terminal then NonTerminal elsewhere. vec1丢弃类型信息,所以你必须记住你在其他地方放入Terminal然后NonTerminal Terminal

vec2 retains all the information, so you can std::visit each element. vec2保留所有信息,因此您可以std::visit每个元素。

vec3 doesn't contain any Terminal or NonTerminal objects, it copied the Symbol base subobjects out of the values in the initialiser. vec3不包含任何Terminal或非NonTerminal对象,它从初始值设定项中的值中复制Symbol基础子对象。 Notably the token member of Terminal is not copied.值得注意的是, Terminaltoken成员没有被复制。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM