在struct和main中分配内存的区别?

时间:2014-10-14 07:38:45

标签: c++ pointers new-operator

我有两个这样简单的结构:

struct Point{
    double x, y;
};

像这样定义

之间有什么区别
struct Circle{
    Point *P;
    float radius;
};

和这个

struct Circle{
    Point *P = new Point;
    float radius;
};

如果我使用第一个样本并在main函数

中执行此类操作,是否有任何优势?
Circle *C = new Circle;
C -> P = new Point;

4 个答案:

答案 0 :(得分:5)

此:

struct Circle{
    Point *P = new Point;
    float radius;
};

使用C ++ 11类内初始化。这意味着默认情况下,如果没有其他构造函数(在您的示例中没有),P将被设置为new Point任何构造的Circle。这相当于您创建P后明确设置Circle的示例的代码行数。

当然,使用您提供的示例代码,您最好只使用值而不是指针:

struct Circle{
    Point P;
    float radius;
};

然后Point内总会有Circle,我们不必在资源管理,内存泄漏等方面进行长时间的尴尬谈话。

答案 1 :(得分:4)

您的两个示例之间没有任何性能或行为差异,但通常,您应该将资源分配(和释放)放在拥有数据的类中。这样,负责分配和解除分配是合乎逻辑的。

我假设这是一个简化的例子,并且不建议完全删除指针。

答案 2 :(得分:2)

这是一个C ++ 11特性:非静态数据成员的类内初始化,并通过分配内存直接初始化指针(if no other constructor does the same thing in the member initialization list of a constructor

struct Circle{
    Point *P = new Point;
    float radius;
};

等效(即没有性能差异)
Circle *C = new Circle;
C -> P = new Point;

但你应该使用它们,否则你会泄漏内存。建议使用智能指针。

对于像Point这样的对象,我还建议将其保留为子对象,而不是指针。

答案 3 :(得分:1)

两种解决方案之间没有干预优势,差别不大。

但是,严格考虑不使用动态分配和指针来存储这种微小的数据结构[1]。这是因为动态分配不仅需要额外的时间(调用new),而且需要更多内存(在大多数操作系统中,存在16字节或更多的开销,并且大小被四舍五入到至少16字节边界x86体系结构,允许SSE访问动态分配的内存)。所以你的16个字节的两个double现在占用了8个字节的指针,32个字节的分配空间(开销+舍入),总共40个字节 - 比直接放置的字节多24个字节圆形物体。

每次(嗯,任何函数中的第一个)访问P成员时,需要有一个指针取消引用来查找xy内的位置Point

您需要以某种方式确保delete Point个对象。

当然有些情况需要指向小对象的指针,例如当它们具有虚拟成员函数时。

[1]特别是因为我说你的Circle对象在没有Point的情况下无法定义你的圈子所在的位置。当对象是可选的时,有一个参数可以使用指针,因为您可以使用NULL来指示它不存在。