c# - 如果可以在同一位置有两个字段,c# 中的 FieldOffsetAttribute 如何与垃圾收集器兼容?
问题描述
在 C# 中,您可以这样做:
[StructLayout(LayoutKind.Explicit)]
public class Stuff
{
public int blah1 = 3;
public String blah2 = "sadfsadf";
public bool blah3 = true;
public ulong blah4 = 23423423420569032;
public Stuff next;
}
[StructLayout(LayoutKind.Explicit)]
public struct SYSTEM_INFO
{
[FieldOffset(0)] public String Blah1;
[FieldOffset(0)] public int[] Blah2;
[FieldOffset(0)] public Stuff Blah3;
}
我不明白垃圾收集如何在托管堆中移动对象并更改指针所指的位置时能够做到这一点,而不会从根本上改变它的行为以及它如何能够遍历堆栈。
如果垃圾收集器移动位于 in 的字符串Blah1
,in 将尝试更改 at 的引用Blah1
,这将间接更改Blah2
and的引用Blah3
。这是否意味着垃圾收集器将自动在Blah2
and处收集引用的对象Blah3
,如果它们仅在此SYSTEM_INFO
结构中被引用?
垃圾收集器如何知道该Blah3
字段是否是一个有效的 Stuff,应该通过它来了解下一个字段是否需要标记为已使用,或者该Blah3
字段是否只是指向字符串的开头(使用 from Blah1
)?
解决方案
推荐阅读
- javascript - 如何在本机反应中修复“.then 不是函数”
- html - 在列表视图中打开和关闭可展开按钮
- android - 我的 kotlin 代码出现问题...有人可以检查我的代码吗?
- javascript - 元素类型无效:应为字符串(用于内置组件)或类/函数(用于复合组件)
- angular - 角度材料表检索数据但不将其可视化
- sql - 此 SELECT 语句 (PLSQL) 中需要一个 INTO 子句
- python - Selenium 找不到 99% 的元素,为什么?
- python - Python 3.7.4 在 Windows 上是否缺少兼容性 EXE 文件?
- java - 我如何通过 lambda 创建字符串比较器?
- html - HTML & CSS Slide Out Navigation - 我做错了什么?