我有一个类使用boost::variant存储一个双或字符串,如下所示:
class value
{
boost::variant<double, std::string> val;
};
对于我正在玩的玩具解释器来说,它应该是一个不变的值类型。起初,通过const引用传递它并按值返回似乎是个好主意,并且总是将它分配到堆栈中,因为我希望它作为一个原语来处理。但是,我看到它的大小是40个字节(主要是由于std::string的大小),我有点担心。我知道我不应该在堆栈上分配大量内存,但是有多大才是太大呢?
而且,每次返回时都要复制40个字节,特别是因为这个值是不可变的,甚至不需要复制,这似乎有点浪费。
常规堆分配选项似乎不太吸引人,因为每秒可能会有数千个这样的分配/释放。
我想出的最后一个选项是,在需要的时候提供一个助推::池来分配这些对象,并使用boost::shared_ptr来管理它们的生命周期。但是,由于解释器负责内存分配(内存分配的类型将是作为模板参数传递给解释器的策略),这意味着值类必须了解解释器,这会使事情稍微复杂化。
以下是问题所在:
谢谢。
发布于 2011-06-07 05:14:51
和往常一样,编写程序以便最容易理解。如果分析稍后发现这确实是一个问题,那么以后始终可以将value::val
转换为一些动态分配的对象。(当然,这假定val
被抽象得足够好,因此不会影响任何类的客户端。)
这也取决于你在哪个平台上。我们是在讨论运行烤面包机的8位嵌入式芯片还是64位工作站?
最后,它归结为:它太大了,如果它造成的问题,因为它的规模。
发布于 2011-06-07 05:28:15
如果您确实需要优化这一点,我建议您不要在Windows上使用std::string
。
对于不可变的字符串,类似于实现的副本(基本上,字符串的所有副本共享同一个内部缓冲区)可以很容易地在shared_ptr
上实现。
从那时起,您只需要在ConstString
类中使用一个指针,就不必担心通过复制传递。
https://stackoverflow.com/questions/6265492
复制相似问题