【发布时间】:2017-02-21 22:00:49
【问题描述】:
在某些情况下,我的 C++14 程序需要大约 1 亿个“块”complex<float>,这需要接近 1 GB 的 RAM。我们可以放心地假设所需的内存将可用。
但是分配一个新的std::vector 真的很慢,因为复杂的构造函数调用了1亿次。在我的机器上,代码需要大约一秒钟的时间来初始化数组。
相比之下,调用calloc(),将分配的内存初始化为零,效果基本相同,运行时间非常短。
事实证明,我们甚至不需要这个初始化,因为大数组中的复合体稍后会从外部源填充。因此,我正在考虑将那个“块”中的对象的构造推迟到以后,然后直接从外部数据源构造它们。
所以我的问题是,是否有一种安全的惯用且有效的 C++ 方法来做到这一点,也许在此过程中使用 C++ 移动语义?如果不是,我们决定简单地malloc 内存块,那么我们可以简单地将内存块reinterpret_cast 转换为complex<float> 的普通旧C 数组吗?
感谢您的帮助
让-丹尼斯·梅斯
【问题讨论】:
-
使用
std::vector<>,但使用reserve()成员函数,而不是resize()或大小的构造函数。 -
用优化编译真的这么慢吗?我不敢相信。
-
为什么要在这种情况下使用矢量?您不能将内存附加/分离到向量,但您可以使用指针而不是迭代器来使用所有标准算法。
-
我不想想要使用
vector。我尝试过vector和原始的malloc,并得到了巨大的性能差距,这对我来说实际上很重要。我基本上是在寻找性能、清晰度、安全性和类似质量标准之间的最佳点。 -
附带说明,
calloc经常可以cheat and not really allocate memory, or wait before really handing out the memory to you,费用稍后会出现。不要依赖它在呼叫点的明显良好表现。
标签: performance optimization constructor c++14 large-data