Mono 单声道阵列是否自然对齐?

Mono 单声道阵列是否自然对齐?,mono,clr,Mono,Clr,在CLR的Mono实现中,阵列对齐的情况如何?它们是否保证在所有平台上自然对齐?如果否,在哪些平台上可以安全地假定CLR管理的阵列自然对齐 因此,有两个相关问题: 其中,答案描述了ECMA-335标准的对准保证 其中答案描述了Microsoft.Net framework的对齐保证 我正在寻找有关Mono framework的类似信息。对于长阵列和双阵列,我们保证阵列元素在64位平台上自然对齐 在32位平台上,它们也恰好是自然对齐的,这不太可能改变,因为一些32位体系结构也需要双倍对齐,我们

在CLR的Mono实现中,阵列对齐的情况如何?它们是否保证在所有平台上自然对齐?如果否,在哪些平台上可以安全地假定CLR管理的阵列自然对齐

因此,有两个相关问题:

  • 其中,答案描述了ECMA-335标准的对准保证

  • 其中答案描述了Microsoft.Net framework的对齐保证


我正在寻找有关Mono framework的类似信息。

对于长阵列和双阵列,我们保证阵列元素在64位平台上自然对齐

在32位平台上,它们也恰好是自然对齐的,这不太可能改变,因为一些32位体系结构也需要双倍对齐,我们将在它们上保持代码一致

请注意,您希望库支持从数组中的任何索引开始的处理,并且由于您使用的是需要16字节对齐的SIMD指令,因此始终需要检查并在数据的开始/结束处执行标量处理


对于结构/类中的长字段和双字段,并非所有32位系统都能保证对齐,这取决于ABI,但至少是32位。

这是模糊的。您是指数组引用、数组对象本身还是数组元素?猜猜后者是什么类型的元素?首先管理的规则是CLI保证对象引用和int类型的值的更新是原子的。提供这种保证的唯一实用方法是,对于32位进程,将它们至少对齐到4的倍数,对于64位进程,将它们对齐到8的倍数。这不是托管代码所独有的。如果你需要知道这个问题的答案,那么你可能做错了。我指的是数组元素。由于1、2和4个元素的数组是由ECMA-335自然对齐的,所以我关心的是8字节元素(long、ulong和double)。不要指望它。为什么这很重要?如果这真的很重要,你打算怎么办?您可以更改代码,它是Mono。我开发了一个带有C#绑定的数学库(www.yeppp.info)。它允许C#代码调用SIMD优化的本机函数以获得更好的性能。当SIMD加载/存储指令与16/32/64字节对齐的指针(取决于SIMD ISA)一起工作时,它们的效率更高。如果数组指针最初是自然对齐的,我可以通过逐个处理前几个元素使其对齐16/32/64字节。如果我不能依靠阵列自然对齐,则需要大量重新对齐代码,这也会影响性能。SSE2需要16字节对齐,这在任何CLI实现中都无法实现。这是一个可怕的问题。