【发布时间】:2018-06-22 22:25:55
【问题描述】:
所以我目前正在尝试在 C++ 中动态分配大量元素(使用“new”)。显然,当“large”变得太大(>4GB)时,我的程序会因“bad_alloc”异常而崩溃,因为它找不到这么大的可用内存。
我可以分别分配数组的每个元素,然后将指向这些元素的指针存储在单独的数组中。但是,时间在我的应用程序中至关重要,因此我想尽可能避免缓存未命中。我也可以将其中一些元素组合成块,但这样的块的最佳大小是多少?
然后我的问题是:动态分配大型元素数组的最佳方式(时间)是什么,这样元素不必连续存储但必须可以通过索引访问(使用 [])? 这个数组永远不会被调整大小,不会插入或删除任何元素。
我认为我可以为此目的使用 std::deque,因为我知道 std::deque 的元素可能会或可能不会连续存储在内存中,但我读到有人担心这个容器需要额外的内存吗?
感谢您对此的帮助!
【问题讨论】:
-
询问您认为“合理”的最大块,如果发生这种情况,请抓住
bad_alloc,将请求的大小减半。将此代码放入循环并重复,直到分配足够的内存。 -
我无法想象与 4GB 分配相比,
std::deque的内存开销会很大。 -
如果使用 Visual C++,您可能无法为 32 位进程分配超过 2GB 或为 64 位进程分配超过 4GB。您可能不需要那么多内存,需要重新考虑设计。
-
它是特定于操作系统和编译器的。也可能是处理器和ISA 特定的。你有多少内存?什么操作系统,你用什么编译器?
-
@Ron Visual C++ 在分配 >4GB 内存块时没有问题,除非您竭尽全力将 64 位进程限制为 4GB 内存限制。
标签: c++ dynamic-memory-allocation large-data dynamic-arrays deque