Mor*_*enn 6 c++ arrays templates move-semantics c++11
我知道这是一场非常古老的辩论,已经在世界各地多次讨论过.但是我在解决在特定情况下我应该使用哪种方法而不是静态和动态数组之间的另一种方法时遇到麻烦.实际上,我没有使用过C++ 11,我会使用静态数组.但我现在感到困惑,因为两者都有相同的好处.
第一解决方案
template<size_t N>
class Foo
{
private:
int array[N];
public:
// Some functions
}
Run Code Online (Sandbox Code Playgroud)
二解决方案:
template<size_t N>
class Foo
{
private:
int* array;
public:
// Some functions
}
Run Code Online (Sandbox Code Playgroud)
我不可能选择,因为这两者都有自己的优势:
我认为没有一个好的解决方案,但我想得到一些建议,或者只是想知道你对这一切的看法.
我实际上不同意"它取决于".切勿使用选项2.如果要使用翻译时常量,请始终使用选项1或std :: array.你列出的一个优点是,动态数组在分配之前一无所获,实际上是一个可怕的,巨大的劣势,需要特别强调指出.
永远不要有具有多个构造阶段的对象.永远不能.这应该是通过一些大纹身致力于记忆的规则.永远不要这样做.
当你拥有尚未生存的僵尸对象时,虽然也没有完全死亡,但管理其生命周期的复杂性呈指数级增长.您必须检查每个方法是否完全存活,或者只是假装活着.异常安全需要在析构函数中使用特殊情况.您现在已经添加了必须在N个不同位置(#methods + dtor)检查的要求,而不是一个简单的构造和自动销毁.如果你检查,编译器不在乎.其他工程师不会广播此要求,因此他们可能会以不安全的方式调整您的代码,使用变量而不进行检查.现在所有这些方法都有多种行为,具体取决于对象的状态,因此对象的每个用户都需要知道会发生什么. 僵尸会破坏你的(编码)生活.
相反,如果您的程序中有两个不同的自然生命周期,请使用两个不同的对象.但这意味着您的程序中有两种不同的状态,因此您应该拥有一个状态机,其中一个状态只有一个对象而另一个状态只有一个,由异步事件分隔.如果两点之间没有异步事件,如果它们都适合一个函数范围,那么分离是人为的,你应该做单相构造.
转换时间大小应转换为动态分配的唯一情况是当堆栈的大小太大时.然后进行内存优化,应始终使用内存和分析工具对其进行评估,以查看最佳内容.选项2永远不会是最好的(它使用裸指针 - 所以我们再次丢失RAII和任何自动清理和管理,添加不变量并使代码更复杂,并且容易被其他人破坏).尽管您可能不喜欢堆分配成本,但Vector(由位掩码建议)将是首先考虑的.其他选项可能是应用程序图像中的静态空间.但同样,只有在您确定存在内存约束后才能考虑这些问题,并且应该根据实际可测量的需求来确定应该做些什么.
| 归档时间: |
|
| 查看次数: |
5371 次 |
| 最近记录: |