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

时间:2010-03-29 12:35:07

标签: c# .net clr

在Java中,byteshort存储在JVM的“自然”字长中,即大部分是32位。一个例外是一个字节数组,其中每个字节占用一个字节的内存。

CLR是否做同样的事情?

如果 这样做,在什么情况下有例外?例如。这会占用多少内存?

struct MyStruct
{
    short s1;
    short s2;
}

3 个答案:

答案 0 :(得分:3)

虽然它并非真正用于此目的,并且有时可能会给出稍微不同的答案(因为它从编组的角度考虑事物,而不是CLR内部结构的观点),Marhsal.SizeOf可以给出 答案:

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

在这种情况下,它回答4.(即短裤被存储为短裤)。请注意,这是一个实现细节,因此不应该依赖今天的答案。

答案 1 :(得分:2)

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

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

答案 2 :(得分:1)

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

确切地说打包了哪些类型,以及如何依赖于CLR实现和当前平台。规则没有严格定义,因此CLR可以自由地重新安排成员以最有效的方式存储它们。