[英]Is there a more efficient way for storing vector<vector<string>> ? C++
[英]How efficient is storing data within an object in a vector in C++?
我正在制作一個小型虛擬機; 在我的虛擬機中,我從二進制文件中讀取指令。 每條指令的大小為1個字節。 VM啟動時,它將二進制文件加載到向量中。 然后,使用開關和for循環執行指令。
但是,這是我的問題開始的地方。 我有一個稱為“堆棧”的向量; 這是我正在運行的程序的虛擬機堆棧。 問題是我想在向量中存儲不同種類的數據(有符號和無符號整數,字符串等)。
為此,我創建了自己的對象(robj),並創建了類型為“ robj”的向量。 這使我可以存儲所需的數據類型,但是我的問題是:這很浪費嗎?
這是我的對象的實現:
class robj {
public:
int signed_int = 0;
unsigned int unsigned_int = 0;
};
如您所見,我的對象目前確實很小,但是當我添加字符串之類的對象時,它會變得更大。 我認為浪費的部分是,如果我將有符號整數存儲在堆棧中,我還必須存儲無符號整數,因為該對象定義了兩種類型的整數。 隨着我把對象變大,這個問題只會變得更糟。
因此,我想知道,是否有一種不那么浪費的方法?
這就是Boost.Variant的目的。 它實現了有區別的工會,因此您不必:
std::vector<boost::variant<
int,
unsigned int
>> v;
可以有2個解決方案
union robj { int signed_int; unsigned int unsigned int; };
class type_base { type_data my_type; public: type_base(const type_data &t) : my_type(t) {} virtual parse_data() = 0; virtual serialize_data() = 0; virtual type_data get_type() { return my_type; } virtual type_base *clone() = 0; }; class signed_int : public type_base { public: int signed_int; };
您還可以在模板從type_base繼承的地方對類型進行模板化。
確保永遠不要創建會導致對象切片的type_base向量。 感謝Alain的評論
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.