在堆上“溶解”C++数组是否安全?
我目前正在实现我自己的矢量容器,但遇到了一个非常有趣的问题(至少对我来说)。这可能是一个愚蠢的问题,但idk。
我的向量使用一个堆指针数组来堆分配未知类型 (T**) 的对象。我这样做是因为我希望对单个元素的指针和引用保持不变,即使在调整大小之后也是如此。
这是在构造和复制时以性能为代价的,因为我需要在堆上创建数组以及在堆上创建数组的每个对象。(堆分配比堆栈慢,对吧?)
T** arr = new *T[size]{nullptr};
然后对于每个元素
arr[i] = new T{data};
现在我想知道它是否安全、有益(更快)和可能,如果不是单独分配每个对象,我可以在堆上创建第二个数组并将每个对象的指针保存在第一个数组中。然后使用(并删除) 这些对象稍后就好像它们是单独分配的一样。
=> 在堆上分配数组是否比单独分配每个对象更快?
=> 在数组中分配对象并稍后忘记数组是否安全?(我觉得这听起来很愚蠢)
链接到我的 github 仓库:https : //github.com/LinuxGameGeek/personal/tree/main/c%2B%2B/vector
谢谢你的帮助 :)
回答
首先说一句,你不应该在效率方面考虑比较堆/堆栈,而应该考虑对象生命周期:
- 自动数组(你在堆栈上调用的)在定义它们的块的末尾结束它们的生命
- 动态数组(你在堆上调用什么)存在直到它们被显式删除
现在在数组中分配一堆对象总是比单独分配它们更有效。您保存了许多内部调用和各种数据结构来维护堆。简单地说,您只能取消分配数组而不是单个对象。
最后,除了可简单复制的对象,只有编译器而不是程序员知道确切的分配细节。例如(对于常见的实现)一个自动字符串(如堆栈)包含一个指向动态字符数组(如堆)的指针......
换句话说,除非您计划只将容器用于 POD 或可简单复制的对象,否则不要期望自己处理所有分配和释放:非普通对象具有内部分配。