修复后的C#内存和垃圾收集器

时间:2019-02-28 23:50:23

标签: c# pointers garbage-collection unsafe

我正在使用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(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 ++中那样重铸字节以节省内存并希望加快处理速度。

1 个答案:

答案 0 :(得分:1)

  

,但是结构和字节现在将永久占据相同的位置   记忆

fixed的{​​{3}}状态:

  

执行该语句中的代码后,所有固定变量都将   取消固定并进行垃圾回收。因此,不要指向   固定语句之外的那些变量。在中声明的变量   固定语句仅限于该语句

这样,否-更改不是永久-仅 fixed语句内。