在C++中,使成员变量值或指针有什么不同?例如,pThread和线程在以下代码中有什么区别:存储成员指针vs成员值
class A {
public:
boost::thread *pThread;
boost::thread thread;
}
在C++中,使成员变量值或指针有什么不同?例如,pThread和线程在以下代码中有什么区别:存储成员指针vs成员值
class A {
public:
boost::thread *pThread;
boost::thread thread;
}
区别在于对象的内存布局。
成员项存储为结构 - 按顺序连续存储在内存中(可能有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个字节分配给存储实际等级的其他地方。
此外,他们是如何访问,但主要的是布局。 – 2012-01-28 23:10:28
不是很正式的,当你有一个成员指针时,成员指向的对象并不是指向它的对象的生命周期。指针指向的对象可以是NULL。当你需要一个(通过新的)时你负责创建一个实例,并且当你不再需要时清理它(通过删除)。
当你有一个成员实例(而不是一个指针),当其父运行的构造函数,它破坏了父母的析构函数运行时创建的实例。
当你有通过指针的对象,该对象可以在其它多个对象中共享,所以保持指针的对象不一定是一个控制所述尖锐的物体。
指针是您分配内容的地址的名称。所以它有一个固定的大小(例如在Intel x86架构上的32位)。 这意味着,在创建A
对象的情况下,pThread
字段将总是占据32位来存储的存储器,其中boost::thread
将有效地驻留的地址。
如果不使用指针,boost::thread
将其全部创建为A
对象的一部分,所以它会占据大如boost::thread
堆里面,创建一个A
对象时的存储。然而,管理指针可能比使用非指针变量更复杂:某人必须为boost::thread
分配(和取消分配)内存,所以指针将指向一个有效地址,并且不会留下内存泄漏。
其实我知道指针和值之间的区别,我的问题不清楚这个:) – Erik 2012-01-28 23:36:28
好,并行线程是一个指针;-) – 2012-01-28 23:09:35