首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >std::vector<std::vector<T> >对std::vector<T*>

std::vector<std::vector<T> >对std::vector<T*>
EN

Stack Overflow用户
提问于 2014-01-09 15:09:31
回答 4查看 122关注 0票数 0

考虑到内存开销对我的应用程序至关重要,我认为在上面的两个选项中,后者的重量会更轻。我说的对吗?我是基于这样一个事实,即向量的内存开销为4个指针,以跟踪begin()end()size()和分配器。因此,整个模型的总大小将是

代码语言:javascript
复制
(4*sizeof(T*) + sizeof(T)*Ni)*No + 3*sizeof(std::vector<T>*)

这里,我假设NiNo是内部和外部向量中的元素数。通过使用后一个表达式,我希望保存4*sizeof(T*)*No,因为在我的应用程序中,No是巨大的,而Ni <<<< No是巨大的。为了解决这些问题,No的顺序是100百万或更多,Ni通常按350的顺序排列。

提前感谢您的兴趣和想法。

注:我理解并非常乐意支付处理指针的代价。分配、遍历和释放它,我可以这样做,而不需要任何重要的性能开销。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2014-01-09 15:17:06

实际上是4,你错过了分配器。请参阅What is the overhead cost of an empty vector?

取决于你的申请。你从不附加到内部向量中吗?它们都有相同数量的元素吗?存储在内部向量中的数据的平均大小是否很小?

如果你对上述所有问题回答是肯定的,也许T*是一个可以接受的解决方案。如果没有向量的支持,你会如何处理这个问题。仅仅是在记忆上受到打击可能会更容易。

票数 2
EN

Stack Overflow用户

发布于 2014-01-09 15:20:39

正如您所看到的herestd::vector的确切开销取决于实现。

还请注意,如果No非常大,那么在某些实现中,您的数据很可能存储在块中,在这种情况下,您的开销也与块数的顺序相同。

但总的来说,我同意指针实现在空间上更便宜。

票数 1
EN

Stack Overflow用户

发布于 2014-01-09 15:25:15

我认为[ vector<T*> ]会更好。我说的对吗?

它会更小,但不一定是“更好”。这种更改将使您不得不分配和释放内部数组。您将无法再知道内部数组的大小。

还请注意,关于大小的一些开销仍然存在:只要您的内部数组是单独分配的,那么除了请求块的大小之外,分配器还会保留一些额外的存储空间,以便让去分配例程知道块的大小。

如果您的内存需求如此紧迫,请考虑为整个数组分配一个向量,然后将单个块分割成一个指针向量。这将消除在内部分配内部数组的每块开销。

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

https://stackoverflow.com/questions/21023912

复制
相关文章

相似问题

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