C#中sizeof的用法


在C#中,sizeof用來計算類型的大小,單位是字節。有這樣的一個類:

    public class MyUglyClass
    {
        public char myChar1;
        public int myInt;
        public char myChar2;
    }

 

在客戶端,試圖使用sizeof計算該類型的大小。

    class Program
    {
        static void Main(string[] args)
        {
            MyUglyClass m = new MyUglyClass();
            m.myChar1 = 'd';
            m.myInt = 25;
            m.myChar2 = 'a';
            Console.WriteLine(sizeof(MyUglyClass));
        }
    }

運行,報錯:
12

○ 第一個報錯說明要使用sizeof,必須使用關鍵字unsafe
○ 第二個報錯說明sizeof對運行時變量無效,只能針對編譯器變量統計其大小

 

把類改成struct值類型。

    public struct MyUglyClass
    {
        public char myChar1;
        public int myInt;
        public char myChar2;
    }

 

客戶端改成如下:

    class Program
    {
        static void Main(string[] args)
        {
            MyUglyClass m = new MyUglyClass();
            m.myChar1 = 'd';
            m.myInt = 25;
            m.myChar2 = 'a';
            unsafe
            {
                Console.WriteLine(sizeof(MyUglyClass));
            }
            
        }
    }

運行,繼續報錯:"不安全代碼只會在使用 /unsafe 編譯的情況下出現"。
解決方法是:右鍵項目→屬性→生成→勾選"允許不安全代碼"→保存

再次運行,結果:12

 

問題又來了,在MyUglyClass這個值類型結構中,char類型16位,相當於2個字節,int類型32位,相當於4個字節。MyUglyClass類型大小=2+2+4=8個字節,應該是8個字節才對!怎么會是12個字節呢?

 

這就涉及到棧的對齊和填充了。就拿上面的例子來說:原本,棧上有int類型的變量占4個字節,2個char類型的變量分別占2個字節,當棧上的這些變量排列之后,棧還要進行對齊排列,即所有較小字節的變量向最大字節的變量看齊,並且填充空位。

13

紅叉部分是為了對齊而填充補上的。

 

如果想忽略為了對齊而填充補上的部分,可以使用[StructLayout]特性。

    [StructLayout(LayoutKind.Auto)]
    public struct MyUglyClass
    {
        public char myChar1;
        public int myInt;
        public char myChar2;
    }

再次運行,結果:8

 

總結:sizeof只適用於值類型,並且需要在unsafe上下文環境中使用。   


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM