如果我使用以下方式分配了大量(GB)的内存:
int N = ...;
int * array_ = new int[N];
并使用数组的一小部分,这种方法有什么样的缺点,除了显而易见的事实,我在浪费内存?它会影响CPU性能还是使程序不稳定?
这背后的原因是避免使用矢量类,因为在激烈的应用程序中性能受到很大影响.
根据操作系统和(可能)程序如何响应低内存情况,浪费内存可能会使程序变慢或不稳定.没有保证.
在现代操作系统上,大型但大多数未使用的动态数组int应该具有很小的影响或没有影响.大多数未使用的部分只会被分配虚拟内存空间,它永远不会被RAM或交换支持.64位操作系统(如果你正在谈论32GB的RAM,你必须使用它)在虚拟地址空间不会短缺,直到你用掉这些东西2 48字节.
这背后的原因是避免使用矢量类,因为在激烈的应用程序中性能受到很大影响.
创建vector<int>比您需要的更大的内容可能会有很大的性能影响,因为它将被初始化,而这个数组是未初始化的.如果这就是你的意思,那么你的代码应该不会导致比一个巨大的向量更不稳定,并且可能更少因为永远不会触及内存.
如果不是那样的话,那么在启用优化的情况下,矢量不应该有很大的性能损失.因此,您可以使用向量struct UninitializedInt { int value; UninitializedInt() {} };来解决它,以确保无操作默认构造.你可能想添加一个int构造函数和/或一个operator int()让用户的生活更轻松(防止.value在整个地方打字),虽然这会导致模糊的算术运算符,所以它不是一个灌篮.
或者,你可以使用reserve()分配的向量空间,然后resize()或push_back()或insert()根据需要.如果最终你有效地检查边界或修改每次访问的大小,那么你当然只需用一个性能命中替换一个性能命中.
你的代码应该工作.如果您不需要重新实现太多的接口,vector那么消除初始化开销可能是最麻烦的方法.当然你需要确保你正确地释放它.例如:
std::unique_ptr<int[]> array_(new int[N]);