Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net NET中的数组是否自然对齐?_.net_Clr - Fatal编程技术网

.net NET中的数组是否自然对齐?

.net NET中的数组是否自然对齐?,.net,clr,.net,Clr,.NET是否保证.NET字节数组始终正确对齐?我确实需要这样做,以将不安全上下文中的字节数组视为x64中的long,从而使用本机寄存器大小修改数据块 但到目前为止,我还没有找到任何CLR能够保证我的内存访问正确对齐的文档 否。事实上,对于x86抖动,阵列可能会错误对齐。特别是double[]和long[]的问题,垃圾收集器只保证它们将在4对齐。这解释了double[]的特殊规则,这样一个数组在有1000个或更多元素时将被分配到大型对象堆中。大大低于LOH分配的正常规则,85000或更多字节。LO

.NET是否保证.NET字节数组始终正确对齐?我确实需要这样做,以将不安全上下文中的字节数组视为x64中的long,从而使用本机寄存器大小修改数据块


但到目前为止,我还没有找到任何CLR能够保证我的内存访问正确对齐的文档

否。事实上,对于x86抖动,阵列可能会错误对齐。特别是double[]和long[]的问题,垃圾收集器只保证它们将在4对齐。这解释了double[]的特殊规则,这样一个数组在有1000个或更多元素时将被分配到大型对象堆中。大大低于LOH分配的正常规则,85000或更多字节。LOH依赖于Windows堆对齐保证,以8对齐。这不是x64抖动中的其他问题

更具体一点:字节数组永远不会是问题。无论数组从何处开始,字节总是对齐的。使用Microsoft编译器编译的非托管代码中的“long”也不是问题,它是4个字节,因此始终与默认的GC对齐规则对齐。在x64模式下仍然是4字节,因此也没有问题。

在.NET对象(数组是其中的一种)中,始终根据指针大小对齐(例如4字节或8字节对齐)。因此,对象指针和对象数组在.NET中总是对齐的

我还应该指出,在.NET中取消对指针的引用不需要对齐。然而,这将是缓慢的。e、 g.如果您有一个有效的byte*指针,并且指向长度至少为8个字节的数据,则可以将其转换为long*并获取值:

unsafe
{
    var data = new byte[ 16 ];
    fixed ( byte* dataP = data )
    {
        var misalignedlongP = ( long* ) ( dataP + 3 );
        long value = *misalignedlongP;
    }
}

通过阅读.NET的源代码,您可以看到Microsoft有时会考虑对齐,但通常不会。例如内部
System.Buffer.Memmove
方法(请参阅)。该方法具有将字节*强制转换为long的代码路径,在少数地方没有任何对齐检查,调用方法也不会检查对齐情况。

这可能会有所帮助:接受的答案没有处理数组如何对齐的原始问题。字节数组如何对齐?我想将字节数组视为需要正确对齐的长数组。字节数组只是.NET读取字节数组的传输介质。4字节对齐规则在x64上也是正确的吗?在任何情况下,我都不能假定字节数组是自然对齐的,这些字节数组被解释为不同的数据,如long或float?不,如上所述,这在x64中不是问题。根据64位代码中8个字节的对象引用的要求,所有内容都与8对齐。感谢您的详细回答。我总是想知道,你怎么知道这些东西,却没有完整的clr代码。@AloisKraus,因为他是Hans Passant.:-)