对.NET中未对齐字段的读写是绝对primefaces的吗?

C#规范( ECMA-334和ISO / IEC 23270 )有一段关于读写的primefaces性:

12.5变量引用的primefaces性

以下数据类型的读取和写入应为primefaces:bool,char,byte,sbyte,short,ushort,uint,int,float和reference类型。 此外,在前一个列表中具有基础类型的枚举类型的读取和写入也应该是primefaces的。 其他类型的读写,包括long,ulong,double和decimal,以及用户定义的类型,不必是primefaces的。

但我很难想象永远是真的。 例如,我可以使用StructLayout属性布局结构,并强制字段不对齐:

 // sizeof(MyStruct) == 9 [StructLayout(LayoutKind.Sequential, Pack = 1)] struct MyStruct { public byte pad; // Offset: 0 public int value1; // Offset: 1 public int value2; // Offset: 5 } 

现在,当我这样做时,我认为对int的写入不是primefaces的,因为它没有与自然边界对齐:

 MyStruct myStruct = new MyStruct(); myStruct.value1 = 20; 

那么,它是绝对primefaces的(就像规范所说的那样),还是不能保证是primefaces的(例如在x86上)? 无论哪种方式,你有任何来源支持这一点吗?

我认为你是对的……在某些情况下,如果你故意不采取行动,系统将不会按照语言规范行事。 重要的是, ECMA-335在分区I第12.6.6节中明确说明了这一点:

符合标准的CLI应保证对一个位置的所有写访问都是primefaces的(见§I.12.6.2),对正确对齐的内存位置的读写访问不大于本机字大小(native int类型的大小)。大小相同。 primefaces写入除了写入之外不得改变任何位。 除非使用显式布局控件(请参阅分区II(控制实例布局))来更改默认行为 ,否则应正确对齐不大于自然字大小(本机int的大小)的数据元素。 对象引用应被视为存储在本机字大小中。

(大胆强调我的;斜体是在规范中。)