在 C++ 中,ff 我有一个类需要保存一个成员,该成员可以动态分配并用作指针,也可以不用作指针,如下所示:
class A {
type a;
};
或
class A {
A();
~A();
type* a;
};
在构造函数中:
A::A {
a = new type();
}
和析构函数:
A::~A {
delete a;
}
除了动态的需要更多代码之外,这两种方法有什么优点或缺点吗?它们的行为是否不同(除了必须取消引用指针)还是一个比另一个慢?我应该使用哪一个?
最佳答案
有几点不同:
定义类时必须知道每个成员的大小。这意味着您必须包含您的
type
header ,并且您不能像使用指针成员那样只使用前向声明(因为所有指针的大小都是已知的)。这对大型项目的#include
困惑和编译时间有影响。数据成员的内存是封闭类实例的一部分,因此它将与所有其他类成员(无论是在堆栈或堆上)。这对数据局部性有影响 - 将所有内容都放在同一个地方可能会导致更好的缓存利用率等。堆栈分配可能比堆分配快一点。声明太多巨大的对象实例可能会更快地破坏你的堆栈。
指针类型管理起来比较棘手 - 因为它不会随类一起自动分配或销毁,所以您需要确保自己这样做。对于多个指针成员,这变得很棘手 - 如果您在构造函数中
new
所有这些成员,并且在过程中途出现异常,析构函数不会被调用并且您有内存泄漏.最好将指针变量分配给“智能指针”容器(如std::auto_ptr
)立即,这样清理会自动处理(并且您不需要不必担心在析构函数中删除
它们,通常可以让您完全不用编写代码)。此外,任何时候手动处理资源时,您都需要担心复制构造函数和赋值运算符。
关于c++ - 动态与非动态类成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3337694/