所以,长话短说,这显然是有效的代码。在Unity3D中工作 - 在PC上运行良好。在尝试访问特定地址pinned-NRE时为Android-NRE构建,在下面的代码块中进行了注释。
public static unsafe byte[] SerialiseFloat(byte header, float val)
{
data = new byte[5];
fixed (byte* b_ptr = data)
{
*b_ptr = header;
*((float*)(b_ptr + 1)) = val; //NRE
return data;
}
}
并不是随便而是因为它似乎出现在关于不安全环境C#的每一个问题中 - 是的,我需要使用它。不,它对于这个实例并不重要,我知道在这个例子中不必要地使用不安全的上下文(这是来自我的旧序列化lib,生成的契约交给这些方法到序列化成员,它只是一个快速的组合,这些东西需要内联,所以我不使用多个数组。
无论如何,关键点 - 上面评论的NRE。有人知道这是怎么可能的,我怎么可能开始修复它?它一直在发生,它被明确地分配和固定。内存分析显示它被正确引用,所有内容都按预期方式对齐。现在转载了大约15次。
答案 0 :(得分:0)
感谢GSerg发表评论,指出我this question。我现在知道ARM在使用浮点值时出现的对齐约束。我只是强迫我的结构包装严格对齐,因为我知道原因。感谢移动设备和ARM的新手,我完全不知道这一点,肯定会失去一些睡眠,所以非常感谢我!
编辑:在我的代码生成器运行一些序列化测试之后,确认一切正常工作的更新,现在在Android上预处理生成的合同,强制浮点字段始终与4字节内存地址对齐。