-1

所以我有来自dotTrace的非常奇怪的跟踪数据: 在此处输入图像描述

这是结构:

public struct TargetStruct : SomeInterface
{
    private RigidTransform rt;
    public RoundBounds rb;
    public int Start;
    public Bool IsEnabled;
    public TypeEnum TheType;
}
//
// Nested types
//
public struct RoundBounds : SomeInterface
{
    public float3 Center;
    public float Radius;
    public float RadiusSq;
}
public struct Bool : IEquatable<Bool>, SomeInterface
{
    [MarshalAs(UnmanagedType.I1)]
    private bool value;
}
public enum TypeEnum : byte
{
    None,
    Type1,
    Type1
}
public struct RigidTransform
{
    public quaternion rot;
    public float3 pos;
    public static readonly RigidTransform identity = new RigidTransform(new quaternion(0f, 0f, 0f, 1f), new float3(0f, 0f, 0f));
}

这在 Unity 的 mono 2019.4.12-mbe下运行,如果相关,Unity 会生成针对 4.7.1 的项目。Struct 正在通过带有约束的泛型方法传递给 SizeOf where T: struct,尽管这应该是无关紧要的。

这是单声道的 mscorlib 的 IL Marshal.SizeOf<T>在此处输入图像描述 呼叫被转发到外部SizeOf(Type t);

什么可能导致堆分配?我唯一的假设是拳击,但我在这里看不到任何拳击。GetType() 不应该分配

4

2 回答 2

0

您提到的关于分配行为的链接GetType()说它不会每次都分配一个新实例,它并没有说它根本不分配。

第一次调用GetType()特定类型的对象将导致分配一个新RuntimeType实例来表示该类型,但这是一次性分配,随后GetType()对该类型对象的调用将返回现有实例。

于 2021-04-10T19:49:15.893 回答
0

使用 dotMemory 并启用“从开始收集内存分配和流量数据”选项来分析您的应用程序。然后查看“分配”视图。它将向您显示所有字节/对象的准确分配。

您能否告诉我 dotMemory/dotTrace 中的数据是否与您的情况不同?

于 2021-05-10T11:31:17.813 回答