2010-03-29 84 views
2

在Java中,byteshort被存储在JVM的“自然”字长度中,即大部分是32位。一个例外将是一个字节数组,其中每个字节占用一个字节的内存。CLR是否在“自然”大小的位置存储小值?

CLR是否做同样的事情?

如果它确实这样做,在什么情况下是否有例外?例如。这占用了多少内存?

struct MyStruct 
{ 
    short s1; 
    short s2; 
} 

回答

3

虽然这不是真正用于这个目的,并且有时给稍有不同的答案(因为它是思考的事情从一个编组站的观点,而不是一个CLR内部结构点),Marhsal.SizeOf可以给一个答案:

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

在这种情况下,它回答4.(即短裤被存储为短路)。请注意,这是一个实现细节,所以今天的答案不应该被用于任何目的。

+0

我想知道Marshal.SizeOf(typeof(int))是做什么的 – izb 2010-03-29 13:10:29

+0

请注意,可以使用'StructLayout'修改布局,尤其是用于编组的布局。 – OregonGhost 2010-03-29 16:02:11

1

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

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

2

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

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

+0

用于提及'StructLayout'的+1,如果你想做互操作(这是你需要*指定确切的布局),这是最重要的事情。 – OregonGhost 2010-03-29 16:02:55