在C ++中的向量中将数据存储在对象中的效率如何?

时间:2014-12-08 11:27:02

标签: c++ vector

我正在制作一个小型虚拟机;在我的虚拟机中,我从二进制文件中读取指令。每条指令的大小为1字节。当VM启动时,它会将二进制文件加载到向量中。然后我使用开关和for循环来执行指令。

但是我的问题就在这里。我有一个名为" Stack"的矢量;它是我正在运行的程序的虚拟机堆栈。问题是我想在向量中存储不同类型的数据(有符号和无符号整数,字符串等)。

要做到这一点,我创建了自己的对象(r​​obj)并制作了#34; robj"类型的向量。这让我可以存储我想要的数据类型,但我的问题是:这是否浪费?

这是我的对象的实现:

class robj {

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

};

正如你所看到的,我的对象目前非常小,但随着我添加字符串之类的东西,它会变大。我认为浪费的部分是,如果我在堆栈上存储有符号整数,我还必须存储无符号整数,因为该对象定义了两种类型的整数。而这个问题只会越来越严重,因为我把对象变大了。

所以我想知道,这样做的浪费方式是否较少?

2 个答案:

答案 0 :(得分:4)

这是Boost.Variant的用途。它实施了受歧视的工会,因此您不必:

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

答案 1 :(得分:1)

可以有2个解决方案

  1. 使用union
  2. union robj {
      int signed_int;
      unsigned int unsigned int;
    };
    
    1. 使用继承
    2. 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的评论