我正在制作一个小型虚拟机;在我的虚拟机中,我从二进制文件中读取指令。每条指令的大小为1字节。当VM启动时,它会将二进制文件加载到向量中。然后我使用开关和for循环来执行指令。
但是我的问题就在这里。我有一个名为" Stack"的矢量;它是我正在运行的程序的虚拟机堆栈。问题是我想在向量中存储不同类型的数据(有符号和无符号整数,字符串等)。
要做到这一点,我创建了自己的对象(robj)并制作了#34; robj"类型的向量。这让我可以存储我想要的数据类型,但我的问题是:这是否浪费?
这是我的对象的实现:
class robj {
public:
int signed_int = 0;
unsigned int unsigned_int = 0;
};
正如你所看到的,我的对象目前非常小,但随着我添加字符串之类的东西,它会变大。我认为浪费的部分是,如果我在堆栈上存储有符号整数,我还必须存储无符号整数,因为该对象定义了两种类型的整数。而这个问题只会越来越严重,因为我把对象变大了。
所以我想知道,这样做的浪费方式是否较少?
答案 0 :(得分:4)
这是Boost.Variant的用途。它实施了受歧视的工会,因此您不必:
std::vector<boost::variant<
int,
unsigned int
>> v;
答案 1 :(得分:1)
可以有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的评论