在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