2012-01-28 103 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