首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >在这种情况下,如何决定堆栈还是堆与boost::池分配?

在这种情况下,如何决定堆栈还是堆与boost::池分配?
EN

Stack Overflow用户
提问于 2011-06-07 12:57:02
回答 2查看 775关注 0票数 3

我有一个类使用boost::variant存储一个双或字符串,如下所示:

代码语言:javascript
代码运行次数:0
运行
复制
class value
{
  boost::variant<double, std::string> val;
};

对于我正在玩的玩具解释器来说,它应该是一个不变的值类型。起初,通过const引用传递它并按值返回似乎是个好主意,并且总是将它分配到堆栈中,因为我希望它作为一个原语来处理。但是,我看到它的大小是40个字节(主要是由于std::string的大小),我有点担心。我知道我不应该在堆栈上分配大量内存,但是有多大才是太大呢?

而且,每次返回时都要复制40个字节,特别是因为这个值是不可变的,甚至不需要复制,这似乎有点浪费。

常规堆分配选项似乎不太吸引人,因为每秒可能会有数千个这样的分配/释放。

我想出的最后一个选项是,在需要的时候提供一个助推::池来分配这些对象,并使用boost::shared_ptr来管理它们的生命周期。但是,由于解释器负责内存分配(内存分配的类型将是作为模板参数传递给解释器的策略),这意味着值类必须了解解释器,这会使事情稍微复杂化。

以下是问题所在:

  • 在这种情况下我应该做什么?为什么?
  • 有多大不能在堆栈上分配?我相信这也取决于分配的频率和必须复制的频率。

谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-06-07 13:14:51

  • 在这种情况下我应该做什么?为什么?

和往常一样,编写程序以便最容易理解。如果分析稍后发现这确实是一个问题,那么以后始终可以将value::val转换为一些动态分配的对象。(当然,这假定val被抽象得足够好,因此不会影响任何类的客户端。)

  • “太大”在堆栈上分配有多大?我相信这也取决于它的销售频率和复制频率。

这也取决于你在哪个平台上。我们是在讨论运行烤面包机的8位嵌入式芯片还是64位工作站?

最后,它归结为:它太大了,如果它造成的问题,因为它的规模。

票数 4
EN

Stack Overflow用户

发布于 2011-06-07 13:28:15

如果您确实需要优化这一点,我建议您不要在Windows上使用std::string

对于不可变的字符串,类似于实现的副本(基本上,字符串的所有副本共享同一个内部缓冲区)可以很容易地在shared_ptr上实现。

从那时起,您只需要在ConstString类中使用一个指针,就不必担心通过复制传递。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6265492

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档