考虑到内存开销对我的应用程序至关重要,我认为在上面的两个选项中,后者的重量会更轻。我说的对吗?我是基于这样一个事实,即向量的内存开销为4个指针,以跟踪begin()、end()、size()和分配器。因此,整个模型的总大小将是
(4*sizeof(T*) + sizeof(T)*Ni)*No + 3*sizeof(std::vector<T>*)这里,我假设Ni,No是内部和外部向量中的元素数。通过使用后一个表达式,我希望保存4*sizeof(T*)*No,因为在我的应用程序中,No是巨大的,而Ni <<<< No是巨大的。为了解决这些问题,No的顺序是100百万或更多,Ni通常按3到50的顺序排列。
提前感谢您的兴趣和想法。
注:我理解并非常乐意支付处理指针的代价。分配、遍历和释放它,我可以这样做,而不需要任何重要的性能开销。
发布于 2014-01-09 15:17:06
实际上是4,你错过了分配器。请参阅What is the overhead cost of an empty vector?
取决于你的申请。你从不附加到内部向量中吗?它们都有相同数量的元素吗?存储在内部向量中的数据的平均大小是否很小?
如果你对上述所有问题回答是肯定的,也许T*是一个可以接受的解决方案。如果没有向量的支持,你会如何处理这个问题。仅仅是在记忆上受到打击可能会更容易。
发布于 2014-01-09 15:20:39
正如您所看到的here,std::vector的确切开销取决于实现。
还请注意,如果No非常大,那么在某些实现中,您的数据很可能存储在块中,在这种情况下,您的开销也与块数的顺序相同。
但总的来说,我同意指针实现在空间上更便宜。
发布于 2014-01-09 15:25:15
我认为[
vector<T*>]会更好。我说的对吗?
它会更小,但不一定是“更好”。这种更改将使您不得不分配和释放内部数组。您将无法再知道内部数组的大小。
还请注意,关于大小的一些开销仍然存在:只要您的内部数组是单独分配的,那么除了请求块的大小之外,分配器还会保留一些额外的存储空间,以便让去分配例程知道块的大小。
如果您的内存需求如此紧迫,请考虑为整个数组分配一个向量,然后将单个块分割成一个指针向量。这将消除在内部分配内部数组的每块开销。
https://stackoverflow.com/questions/21023912
复制相似问题