簡體   English   中英

在C ++中,將數據存儲在矢量對象中的效率如何?

[英]How efficient is storing data within an object in a vector in C++?

我正在制作一個小型虛擬機; 在我的虛擬機中,我從二進制文件中讀取指令。 每條指令的大小為1個字節。 VM啟動時,它將二進制文件加載到向量中。 然后,使用開關和for循環執行指令。

但是,這是我的問題開始的地方。 我有一個稱為“堆棧”的向量; 這是我正在運行的程序的虛擬機堆棧。 問題是我想在向量中存儲不同種類的數據(有符號和無符號整數,字符串等)。

為此,我創建了自己的對象(r​​obj),並創建了類型為“ robj”的向量。 這使我可以存儲所需的數據類型,但是我的問題是:這很浪費嗎?

這是我的對象的實現:

class robj {

public:
    int signed_int = 0;
    unsigned int unsigned_int = 0;

};

如您所見,我的對象目前確實很小,但是當我添加字符串之類的對象時,它會變得更大。 我認為浪費的部分是,如果我將有符號整數存儲在堆棧中,我還必須存儲無符號整數,因為該對象定義了兩種類型的整數。 隨着我把對象變大,這個問題只會變得更糟。

因此,我想知道,是否有一種不那么浪費的方法?

這就是Boost.Variant的目的。 它實現了有區別的工會,因此您不必:

std::vector<boost::variant<
   int,
   unsigned int
>> v;

可以有2個解決方案

  1. 使用聯盟
union robj {
  int signed_int;
  unsigned int unsigned int;
};
  1. 使用繼承
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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM