[英]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.其中,
Terminal
和NonTerminal
是Symbol
派生类,来自上下文无关语言的基本理论。 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.值得注意的是,
Terminal
的token
成员没有被复制。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.