2014-06-23 64 views
1

我知道,類的成員聲明中的順序對於使用較少的內存很重要(基於類型大小的降序)。例如:class A { int x; double y; int z; };將使用比class A { double y; int x; int z; };更多的內存如果還有靜態成員,如何訂購一個類的成員?

這對於最新的編譯器(我使用Ubuntu)是否仍然如此?如果是,我應該在哪裏放置靜態成員?

class A 
{ 
private: 
    static int m1; 
    double m2; 
    int m3; 

public: 
// ... 
}; 

我應該在哪裏將m1放置在這個地方使用較少的內存?

+0

嗯,我想它沒有任何作用 - 它可能會影響只有實例成員 – ikh

+1

值得指出的是,你的例子可能給每個大小相同的大小。更好的情況:'class A {int32_t x; int64_t y; int32_t z; };'和'class A {int32_t x; int32_t z; int64_t y; };'。 –

+1

他們討厭的編輯器。 –

回答

4

根據C++標準

靜態數據成員不是類的子對象的一部分。

因此,它們在類定義中可能有不完整的類型。他們不影響班級的規模。

+1

我認爲這將是很好的解釋_subobjects_。正如所料,我猜想大量不熟悉C++ Standardese的人會想到派生類,然後感到困惑。 –

+0

@phresnel在這種情況下,這意味着僅僅是作爲成員子對象的類的數據成員。 –

+1

@VladfromMoscow:他的意思是在你的答案中解釋它。 –

2

靜態數據成員不存儲在類實例中;相反,你會得到每個人的一個實例,而這些「活」在你定義他們的地方。

struct A 
{ 
    static int m1; 
    double m2; 
    int m3; 
}; 

int A::m1; // <--- this lives here! 

這樣,的A定義範圍內它們的聲明的位置爲A的非靜態數據成員的填充,對準和訂貨完全無關緊要的。