我知道,这是已经被世界各地的多次讨论一个非常古老的话题。 但我目前有麻烦决定我应该在特定情况下使用哪种方法,而不是另一个静态和动态数组之间。 其实,我woudn't已经使用C ++ 11,我会用静态数组。 但我现在很困惑,因为有可能是与两个对等的利益。
第一个解决方案:
template<size_t N>
class Foo
{
private:
int array[N];
public:
// Some functions
}
解决方法二:
template<size_t N>
class Foo
{
private:
int* array;
public:
// Some functions
}
我不能碰巧选了,因为这两个有自己的优势:
- 静态数组是快的,我们不关心内存管理可言。
- 动态数组不只要内存没有分配任何weigth。 在那之后,他们不太方便比静态数组使用。 但由于C ++ 11,我们可以有从移动语义,这是我们不能用静态数组使用极大的好处。
我不认为这是一个很好的解决方案,但我想获得一些建议或只是知道你怎么想的一切。
我居然会用“这取决于”不同意。 如果你想使用translationtime不变,始终使用选择1或std ::阵列切勿使用选项2。 您列出的一个优势,但动态数组权衡什么,直到分配,实际上是一个可怕的,巨大的劣势,和一个需要被指出了高度重视。
永远不要有有建设的多个阶段的对象 。 永远不能。 这应该是通过一些大型纹身致力于内存的规则。 只是没有做到这一点。
当你有僵尸对象不太活着呢,虽然不是很死或者,在管理他们的一生的复杂性呈指数级增长。 你必须在每一个方法来检查它是否是完全活着,或者只是假装地活着。 异常安全性需要你在析构函数特殊情况。 相反,一个简单的构建和自动化破坏的,你现在又增加了必须在N个不同的地方进行检查(#方法+析构函数)的要求。 如果你检查编译不在乎。 和其他工程师没有这个要求广播,所以他们可以在不安全的方式调整你的代码,使用变量不检查。 现在,所有这些方法都依赖于对象的状态多个行为,所以对象的每个用户都需要知道会发生什么。 僵尸会毁了你 (编码) 的生活。
相反,如果你在程序中两个不同的自然寿命,使用两个不同的对象。 但是,这意味着你有两种不同的状态在你的程序,所以你应该有一个状态机,具有只有一个对象,并使用这两种另一种状态,通过异步事件分开的一个状态。 如果在两个点之间没有异步事件,如果他们都适合在一个功能范围,那么分离是人工,你应该做的单相结构。
其中一个转换时的大小应该转化为动态分配的唯一情况是,当大小的堆栈太大。 这则获取到内存优化,它应该永远使用内存和分析工具,看看什么是最好的评价。 选项2将永远是最好(它采用的是裸指针 - 所以我们再次失去RAII和任何自动清理和管理,增加不变,使代码更复杂,容易受他人易碎)。 矢量(由位掩码建议)将是适当的首先想到的,虽然你可能不喜欢在时间堆分配成本。 其他选项可能是您的应用程序的图像静态空间。 但同样,这些只能一旦你确定你有存储器限制以及如何从那里应该由实际可测量的需要确定考虑。
既不使用。 你已经开使用更好std::vector
几乎任何情况。 在其他情况下,它在很大程度上依赖的原因所在std::vector
是不够的,因此不能笼统地回答!
我目前必须决定哪一个,我应该在特定的情况下,使用比另一个更存在问题。
你需要考虑你的选择的情况下逐案确定给定上下文的最佳解决方案 - 那就是,一个泛化无法进行。 如果一个容器是适合所有的情况下,其他的将被淘汰。
前面已经提到,可以考虑使用std
编写自己之前实现。
更多细节:
固定长度
- 小心多少你消耗堆栈的。
- 可能会占用更多的内存,如果你把它当作一个动态调整大小的容器中。
- 快速复制。
变长
- 重新分配和调整大小可能是昂贵的。
- 可消耗比需要更多的内存。
- 快速移动。
更好的选择,也需要你懂创作的复杂性,复制,转让等元素类型。
如果你使用std
实现,请记住,实现可能会有所不同。
最后,您可以为这些类型的抽象的实施细则,并动态地选择基于规模和背景的适当数据成员的容器 - 抽象的通用接口背后的细节。 这也是有用的,有时禁用功能,或使某些操作(如昂贵的拷贝)更为明显。
总之,你需要知道很多的种类和使用情况,并衡量你的程序的几个方面来确定特定场景的最佳容器类型。
文章来源: Static arrays VS. dynamic arrays in C++11