我有一个类使用 boost::variant 来存储双精度或字符串,如下所示:
class value
{
boost::variant<double, std::string> val;
};
对于我正在玩的玩具解释器,它应该是不可变的值类型。起初,通过 const 引用传递它并按值返回似乎是一个好主意,并始终将它分配在堆栈上,因为我希望它被视为原语。但是,后来我看到它的大小是 40 字节(主要是由于 std::string 的 sizeof),我有点担心。我知道我不应该在堆栈上分配大块内存,但是多大才算太大?
此外,每次返回时复制 40 个字节,特别是因为该值是不可变的,甚至不需要复制,这似乎有点浪费。
常规堆分配选项似乎不太有吸引力,因为我每秒可以有数千个这样的分配/解除分配。
我想出的最后一个选择是在需要时使用 boost::pool 来分配这些对象,并使用 boost::shared_ptr 来管理它们的生命周期。然而,因为解释器负责内存分配(内存分配的类型将是作为模板参数传递给解释器的策略),这意味着值类必须知道解释器,这会使事情稍微复杂化.
所以这些是问题:
- 在这种情况下我应该怎么做,为什么?
- 在堆栈上分配“太大”有多大?我敢肯定,这取决于分配的频率以及必须复制的频率。
谢谢。