2012-01-28 105 views
1

在C++中,使成员变量值或指针有什么不同?例如,pThread和线程在以下代码中有什么区别:存储成员指针vs成员值

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

好,并行线程是一个指针;-) – 2012-01-28 23:09:35

回答

4

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

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

考虑,你有一个struct

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个字节分配给存储实际等级的其他地方。

+0

此外,他们是如何访问,但主要的是布局。 – 2012-01-28 23:10:28

1

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

当你有一个成员实例(而不是一个指针),当其父运行的构造函数,它破坏了父母的析构函数运行时创建的实例。

当你有通过指针的对象,该对象可以在其它多个对象中共享,所以保持指针的对象不一定是一个控制所述尖锐的物体。

1

指针是您分配内容的地址的名称。所以它有一个固定的大小(例如在Intel x86架构上的32位)。 这意味着,在创建A对象的情况下,pThread字段将总是占据32位来存储的存储器,其中boost::thread将有效地驻留的地址。

如果不使用指针,boost::thread将其全部创建为A对象的一部分,所以它会占据大如boost::thread堆里面,创建一个A对象时的存储。然而,管理指针可能比使用非指针变量更复杂:某人必须为boost::thread分配(和取消分配)内存,所以指针将指向一个有效地址,并且不会留下内存泄漏。

+0

其实我知道指针和值之间的区别,我的问题不清楚这个:) – Erik 2012-01-28 23:36:28