在Java中,byte
或short
存储在JVM的“自然”字长中,即大部分是32位。一个例外是一个字节数组,其中每个字节占用一个字节的内存。
CLR是否做同样的事情?
如果 这样做,在什么情况下有例外?例如。这会占用多少内存?
struct MyStruct
{
short s1;
short s2;
}
答案 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可以自由地重新安排成员以最有效的方式存储它们。