c++ - 动态与非动态类成员

标签 c++ class dynamic variables

在 C++ 中,ff 我有一个类需要保存一个成员,该成员可以动态分配并用作指针,也可以不用作指针,如下所示:

class A {
    type a;
};

class A {
    A();
    ~A();
    type* a;
};

在构造函数中:

A::A {
    a = new type();
}

和析构函数:

A::~A {
    delete a;
}

除了动态的需要更多代码之外,这两种方法有什么优点或缺点吗?它们的行为是否不同(除了必须取消引用指针)还是一个比另一个慢?我应该使用哪一个?

最佳答案

有几点不同:

  1. 定义类时必须知道每个成员的大小。这意味着您必须包含您的 type header ,并且您不能像使用指针成员那样只使用前向声明(因为所有指针的大小都是已知的)。这对大型项目的 #include 困惑和编译时间有影响。

  2. 数据成员的内存是封闭类实例的一部分,因此它将与所有其他类成员(无论是在堆栈或堆上)。这对数据局部性有影响 - 将所有内容都放在同一个地方可能会导致更好的缓存利用率等。堆栈分配可能比堆分配快一点。声明太多巨大的对象实例可能会更快地破坏你的堆栈。

  3. 指针类型管理起来比较棘手 - 因为它不会随类一起自动分配或销毁,所以您需要确保自己这样做。对于多个指针成员,这变得很棘手 - 如果您在构造函数中 new 所有这些成员,并且在过程中途出现异常,析构函数不会被调用并且您有内存泄漏.最好将指针变量分配给“智能指针”容器(如 std::auto_ptr)立即,这样清理会自动处理(并且您不需要不必担心在析构函数中删除它们,通常可以让您完全不用编写代码)。此外,任何时候手动处理资源时,您都需要担心复制构造函数和赋值运算符。

关于c++ - 动态与非动态类成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3337694/

相关文章:

c - 如何为动态二维数组的整行赋值?

java - 使用 Java Swing 计算并显示文本框中的字符数

python - 如何使用 Python 3 元类动态生成中间类

c++ - 无法在 ubuntu 上的 netbeans 中进入 C++ 程序像素城市

c++ - 将整数“转换”为字符串

c++ - sizeof() 运算符在 C++ 中做什么

python - 如何按照Python教科书的要求实现 'class Card'

java - 如何在不创建java对象的情况下从包内的所有类访问方法

c++ - Qt creator 无法解析 stddef.h --> 不正确的代码完成和突出显示

Python 向量类