C++分配内存的缺点
C++ allocating memory drawbacks?
如果我使用分配了很多(GB)内存
int N = ...;
int * array_ = new int[N];
使用数组的一小部分,除了明显的事实之外,这种方法还有什么缺点,我在浪费内存?它会影响cpu性能还是使程序不稳定?
这背后的原因是避免使用向量类,因为在密集的应用程序中会对性能造成很大影响。
根据操作系统和(可能)程序对低内存情况的反应,浪费内存可能会使程序变得缓慢或不稳定。没有保证。
在现代操作系统上,大型但大部分未使用的动态int
阵列应该影响很小或没有影响。阵列中大多数未使用的部分将只分配虚拟内存空间,它永远不会由RAM或交换支持。64位操作系统(如果你谈论的是32GB的RAM,你必须使用它)不会缺少虚拟地址空间,直到你用掉248字节。
这背后的原因是避免使用向量类,因为在高强度的应用程序中,性能大受影响。
创建一个比您需要的大的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]);
使用数组的一小部分,除了明显的事实之外,这种方法还有什么缺点,我在浪费内存?它会影响cpu性能还是使程序不稳定?
您的代码将很难维护,并且异常不安全。(是的,会的。不,真的。)
这背后的原因是避免使用向量类,因为在密集的应用程序中会对性能造成很大影响。
这在任何值得尊敬的C++实现中都是错误的。std::vector
的开销为零。编译器比你更善于优化,并且可以内联成员函数等等。
关于您的评论:
这是因为当添加一个新项时,向量类会将所有数组数据复制到一个新数组中,然后删除旧数组。基准测试显示,命中率至少为50%,在某些情况下为100%。
参见std::vector::reserve
。
唯一真正可靠的方法是实际执行并运行性能测试。试着用你想的所有方法来做,并根据这些真实测试记录的实际数据进行比较和对比。但除此之外,一个有根据的猜测是,你大大高估了std::vector
的性能命中率。
这里已经解决了这个问题。
答案是:
使用std::vector/std::array总是更好的,至少在您可以(通过分析)最终证明T*a=新T[100];解决方案在您的特定情况下要快得多。这是不太可能发生:矢量/阵列是围绕普通的老数组。使用进行边界检查会产生一些开销vector::at,但您可以通过使用运算符[]来绕过它。
这背后的原因是避免使用向量类,因为在密集的应用程序中会对性能造成很大影响。
据我所知,使用矢量并不会对性能造成很大影响。除非你能更具体,否则你的整个论点都是无效的(即你应该使用向量)。
不过,向量使用不当可能会带来性能开销(问题不在于向量,而在于客户端代码)。如果您确实使用矢量,请考虑使用保留。否则,请尝试std::forward_list或std::list(如果需要不一致地添加元素)。
- 将字符串存储在c++中的稳定内存中
- C++ 指针的内存地址和指向数组的内存地址如何相同?
- Win32编译器选项和内存分配
- 当vector是tje全局变量时,c++中vector的内存管理
- 带内存和隔离功能的SQLite
- 是否可以通过C++扩展强制多个python进程共享同一内存
- 迭代时从向量和内存中删除对象
- 在C++中打印指向不同基元数据类型的指针的内存地址
- 这个指针和内存代码打印是什么?我不知道是打印垃圾还是如何打印我需要的值
- 多个文件的内存分配错误"在抛出 'std :: bad_alloc' what (): std :: bad_alloc 的实例后终止调用" [C++]
- 为什么示例代码访问IUnknown中已删除的内存
- 如何在C++类内存结构中创建"spacer"?
- 从构造函数抛出异常时如何克服内存泄漏
- malloc() 可能出现内存泄漏
- 如何理解将半精度指针转换为无符号长指针和相关的内存对齐
- 在调用FreeLibrary后,释放动态链接到具有相同版本的CRT堆的DLL的内存
- 如何针对特定情况调试和修复此双自由内存损坏问题
- std::unordered_map 在共享内存中使用 boost:::进程间分配器 - 缺点?
- C++分配内存的缺点
- 环形缓冲区:缺点是向后移动内存