代码之家  ›  专栏  ›  技术社区  ›  izb

CLR是否在“自然”大小的位置存储小值?

  •  2
  • izb  · 技术社区  · 16 年前

    在Java中,一个 byte short

    CLR做同样的事情吗?

    如果它

    struct MyStruct
    {
        short s1;
        short s2;
    }
    
    3 回复  |  直到 16 年前
        1
  •  3
  •   Damien_The_Unbeliever    16 年前

    尽管它并不是真正用于此目的,有时可能会给出稍微不同的答案(因为它是从编组的角度考虑问题,而不是从CLR内部结构的角度考虑问题), Marhsal.SizeOf 可以给予 一 回答:

    System.Runtime.InteropServices.Marshal.SizeOf(typeof(MyStruct))
    

        2
  •  2
  •   Hans Passant    16 年前

    JIT编译器的工作实际上是分配类和结构的内存布局。实际的布局在任何方面都是不可发现的(除了查看生成的机器代码),需要一个[StructLayout]属性将对象封送到一个已知的布局。JIT通过对字段重新排序来利用这一点,以保持字段对齐并最小化分配大小。

    在您引用的结构中不会有任何意外,这些字段已经在任何可以执行托管代码的当前CPU体系结构上对齐。值类型的大小由CLI保证,一个short总是需要16位。你的结构需要32位。

        3
  •  1
  •   Guffa    16 年前

    CLR在某种程度上会打包相同大小的成员。它确实打包了数组,我希望您的示例结构在任何平台上都会占用4个字节。

    具体打包哪些类型以及打包方式取决于CLR实现和当前平台。规则没有严格定义,因此CLR可以自由地重新排列成员,以最有效的方式存储它们。

    推荐文章