[英]Performance comparison about template parameters of container?
我正在開發一個包含不同類型向量的應用程序,如下所示
#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
}
其中, Terminal
和NonTerminal
是Symbol
派生類,來自上下文無關語言的基本理論。 在三個向量中,哪個最快,考慮迭代元素?
一個關鍵問題是派生類Terminal
持有一個額外的成員變量token
。 另一種實現(我同事的想法)如下所示,
#include <vector>
class Symbol{
bool isTerminal; // to differentiate Terminal and NonTerminal
Token token;
};
Terminal main(){
std::vector<Symbol> vec;
}
這個怎么樣?
他們做不同的事情,所以說哪個更快是沒有意義的。
vec1
丟棄類型信息,所以你必須記住你在其他地方放入Terminal
然后NonTerminal
Terminal
。
vec2
保留所有信息,因此您可以std::visit
每個元素。
vec3
不包含任何Terminal
或非NonTerminal
對象,它從初始值設定項中的值中復制Symbol
基礎子對象。 值得注意的是, Terminal
的token
成員沒有被復制。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.