固定后的C#内存和垃圾收集器

问题描述 投票:0回答:1

我正在使用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 ++中用来节省内存并希望加快进程一样。

c# pointers garbage-collection unsafe
1个回答
1
投票

但结构和字节现在会永久占用相同的内存

docs州的fixed

执行语句中的代码后,将取消固定任何固定变量并进行垃圾回收。因此,不要指向固定语句之外的那些变量。在fixed语句中声明的变量的作用域是该语句

因此,不 - 改变不是永久性的 - 它仅限于fixed声明中。

© www.soinside.com 2019 - 2024. All rights reserved.