Fog*_*lio 5 c++ variables class dynamic
在C++中,我有一个类需要保存一个可以动态分配并用作指针的成员,如下所示:
class A {
type a;
};
Run Code Online (Sandbox Code Playgroud)
要么
class A {
A();
~A();
type* a;
};
Run Code Online (Sandbox Code Playgroud)
并在构造函数中:
A::A {
a = new type();
}
Run Code Online (Sandbox Code Playgroud)
和析构函数:
A::~A {
delete a;
}
Run Code Online (Sandbox Code Playgroud)
除了需要更多代码的动态之外,任何一个都有任何优点或缺点吗?它们的行为是否不同(除了必须被解除引用的指针)或者是一个比另一个慢?我应该使用哪一个?
有几个不同之处:
在定义类时,必须知道每个成员的大小.这意味着你必须包含你的type标题,你不能像使用指针成员一样使用前向声明(因为所有指针的大小都是已知的).这#include对大型项目的混乱和编译时间有影响.
为数据成员的存储器是的一部分的包围类的实例,所以它会在同一时间被分配,在同一个地方,因为所有其他的类成员(是否堆栈或堆上).这对数据局部性有影响 - 将所有内容放在同一位置可能会带来更好的缓存利用率等.堆栈分配可能比堆分配快一些.声明太多巨大的对象实例可能会更快地破坏堆栈.
指针类型管理起来比较棘手 - 因为它不会自动与类一起分配或销毁,所以你需要确保自己这样做.多个指针成员变得棘手 - 如果你new在构造函数中使用它们,并且在进程的中途有一个例外,析构函数不会被调用而你有内存泄漏.这是更好地指针变量赋值给一个"智能指针"容器(如std::auto_ptr)立即,这样一来清理被自动处理(和你不需要担心delete荷兰国际集团他们在析构函数中,经常写一个在所有节省您的) .此外,无论何时手动处理资源,都需要担心复制构造函数和赋值运算符.
使用指针,您可以拥有更多控制权,但也可以承担更多责任。您拥有更多控制权,可以更精确地决定对象的生命周期,而如果没有指针,生命周期基本上等于包含对象的生命周期。此外,对于指针,成员实际上可以是指针类型的子类的实例。
从性能角度来看,使用指针确实意味着更多的内存使用、更多的内存碎片,并且取消引用确实需要大量时间。然而,对于除了对性能最关键的代码之外的所有代码来说,这些都不值得担心。
| 归档时间: |
|
| 查看次数: |
3068 次 |
| 最近记录: |