gpt4 book ai didi

c# - 从内存位置复制字节时是否需要固定结构

转载 作者:可可西里 更新时间:2023-11-01 09:00:34 24 4
gpt4 key购买 nike

我在 C# 中定义了一个结构来镜像 native 数据结构,并使用了 Sequential 的 StructLayout。为了将结构转换为 Socket IOControl 方法所需的 12 字节(3x 4 字节),我使用 Marshal.Copy 将字节复制到数组。

由于结构只包含值类型,我是否需要在执行复制之前固定结构?我知道 GC 会压缩堆,因此引用类型的内存地址可能会在 GC 期间发生变化。堆栈分配的值类型也是如此吗?

包含 pin 操作的当前版本如下所示:

[StructLayout(LayoutKind.Sequential, Pack = 1)]  
struct TcpKeepAliveConfiguration
{
public uint DoUseTcpKeepAlives;
public uint IdleTimeMilliseconds;
public uint KeepAlivePacketInterval;

public byte[] ToByteArray()
{
byte[] bytes = new byte[Marshal.SizeOf(typeof(TcpKeepAliveConfiguration))];
GCHandle pinStructure = GCHandle.Alloc(this, GCHandleType.Pinned);
try
{
Marshal.Copy(pinStructure.AddrOfPinnedObject(), bytes, 0, bytes.Length);
return bytes;
}
finally
{
pinStructure.Free();
}
}
}

有什么想法吗?

最佳答案

如果您的结构被 lambda 表达式捕获,它不会存储在堆栈中

因此,我建议您在复制之前始终固定结构。

Eric Lippert 写了一个 article about value type storage你可能会感兴趣。

关于c# - 从内存位置复制字节时是否需要固定结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5714768/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com