我正在使用BinaryReader.Read
从二进制文件中读取字节,并使用fixed
语句将字节“转换”为结构:
[StructLayout(LayoutKind.Sequential, Pack = 1)]
unsafe struct MyStruct
{
// some variables.. too many to list
public fixed Byte Software[32];
public UInt16 FC_Day;
public UInt16 FC_Year;
public UInt16 Header_Size;
public UInt32 Offset_to_Data;
// more variables.. too many to list
};
然后在Main:
byte[] ReadBytes = new byte[227];
MyStruct* Header;
InFile.Read(ReadBytes, 0, 227);
fixed (byte* bHdrPtr = &ReadBytes[0])
{
Header = (LASHeader*)bHdrPtr;
//now Header and ReadBytes occupy the same memory
}
此时,ReadBytes
的任何变化都会改变Header
,反之亦然。据我所知,fixed
语句在fixed
块中免除指针移动,但结构和字节现在会永久占用相同的内存还是内部内存管理会分别移动/移动地址?即,我可以信任fixed
块后的结构指向相同的有意义的内存而不是随机字节或全0吗?
以前我声明bytes[227]
和MyStruct
并使用Buffer.BlockCopy
将字节从数组复制到结构..这是非常低效的,需要双倍的内存和块复制每次读取新的字节所以我宁愿重铸就像我在C ++中用来节省内存并希望加快进程一样。
但结构和字节现在会永久占用相同的内存
docs州的fixed
:
执行语句中的代码后,将取消固定任何固定变量并进行垃圾回收。因此,不要指向固定语句之外的那些变量。在fixed语句中声明的变量的作用域是该语句
因此,不 - 改变不是永久性的 - 它仅限于fixed
声明中。