存储成员指针与成员值

时间:2012-01-28 23:05:41

标签: c++

在C ++中,制作成员变量值或指针有什么区别?例如,以下代码中pThread和thread之间的区别是什么:

class A {
public:
    boost::thread *pThread;
    boost::thread thread;
}

3 个答案:

答案 0 :(得分:4)

区别在于对象的内存布局。

成员项目像结构一样存储 - 按顺序连续存储在内存中(可能有2-4-8个字节对齐,但另外一个接一个地顺序存储)。指针作为4/8字节指针存储在存储器地址中,而实际对象可以存储在存储器中的任何位置。

考虑你有结构

的情况
struct grades {
    unsigned char math;
    unsigned char english;
    unsigned char history;
    unsigned char physics;
    unsigned char chemistry;
    unsigned char biology;
    unsigned char computers;
};

结构的大小是7个字节。

现在,如果你有一个班级Student_member:

class Student_member {
    unsigned long id;
    struct grades _grades;
};

和一个Student_pointer类:

class Student_pointer {
    unsigned long id;
    struct grades *_grades;
};

然后类Student_member的内存大小将是4 + 7 = 11个字节(长+结构),它将被分配为连续块,而类Student_pointer的内存大小将是4 + 4 = 8字节(长+指针)和另外7个字节,分配在存储实际成绩的内存中的其他位置。

答案 1 :(得分:2)

不是很正式,当你有一个成员指针时,成员指向的对象不会指向指向它的对象的生命周期。指针指向的对象可以为NULL。您负责在需要时(通过新建)创建实例,并在不再需要时(通过删除)清除实例。

当你有一个成员实例(而不是一个指针)时,实例会在其父项的构造函数运行时创建,并在父项的析构函数运行时被销毁。

当你有一个通过指针的对象时,该对象可以在其他几个对象之间共享,因此持有指针的对象不一定是控制指向对象的对象。

答案 2 :(得分:1)

指针是您分配内容的内存地址的名称。因此它具有固定的大小(例如,在Intel x86架构上为32位)。 这意味着当创建A对象时,pThread字段将始终占用该32位来存储boost::thread将有效驻留的内存地址。

如果您不使用指针,boost::thread将作为A对象的一部分完整地创建,因此它将占用与boost::thread一样大的存储空间在堆栈内部,当创建A对象时。

然而,管理指针可能比使用非指针变量更复杂:有人必须为boost::thread分配(并释放)内存,因此指针将指向有效地址且没有内存泄漏将离开。