|
剛剛看了李建忠老師的 C#和C++/CLI中sizeof操作符討論 因此一直想搞清楚C# 中的class到底占用了多少內(nèi)存。翻閱資料 MSDN: 結(jié)構(gòu)(值類型)的大小被計(jì)算為其字段大小的總和,外加由于將這些字段與其自然邊界對(duì)齊而增加的任何開銷。 請(qǐng)考慮以下 C# 結(jié)構(gòu)(為簡(jiǎn)單起見(jiàn),我已經(jīng)避免為下列成員指定任何訪問(wèn)修飾符): struct BadValueType
{
char c1;
int i;
char c2;
}
就像非托管 C++ 中的默認(rèn)封裝一樣,整數(shù)在四字節(jié)邊界上布局,因此盡管第一個(gè)字符使用兩個(gè)字節(jié)(托管代碼中的 char 是 Unicode 字符,因而占據(jù)兩個(gè)字節(jié)),但該整數(shù)向上移動(dòng)至下一個(gè) 4 字節(jié)邊界,并且第二個(gè)字符使用隨后的 2 個(gè)字節(jié)。得到的結(jié)構(gòu)在用 Marshal.SizeOf 度量時(shí)是 12 個(gè)字節(jié)(當(dāng)用在我的 32 位計(jì)算機(jī)上運(yùn)行的 .NET Framework 2.0 上的 sizeof 度量時(shí),也是 12 個(gè)字節(jié))。如果我將其重新組織為如下所示的結(jié)構(gòu),則對(duì)齊方式將如我所愿,從而得到 8 字節(jié)結(jié)構(gòu): struct GoodValueType
{
int i;
char c1;
char c2;
}
|
|
|