Tencent / xLua

xLua is a lua programming solution for C# ( Unity, .Net, Mono) , it supports android, ios, windows, linux, osx, etc.
Other
9.42k stars 2.46k forks source link

无法在包含 IntPtr 的结构体上使用 GCOptimize #1141

Open svermeulen opened 6 months ago

svermeulen commented 6 months ago

我正在使用 GCOptimize 特性在 C# 和 Lua 之间传递结构体,以避免内存分配。但是在我的一些数据中,我存储了一个 IntPtr 值。这似乎导致周围的结构体被装箱为用户数据,而不是按值传递。例如:

[GCOptimize]
public struct Bar
{
    public IntPtr Daz;
}

public static class LuaApiTests
{
    // 当从 Lua 调用时,这个函数工作时不会有任何内存分配
    public static IntPtr Foo()
    {
        return (IntPtr)123;
    }

    // 当从 Lua 调用时,这个函数会导致内存垃圾分配
    public static Bar Bar()
    {
        return new Bar()
        {
            Daz = (IntPtr)123,
        };
    }
}
chexiongsheng commented 2 months ago

这里需要在生成代码阶段计算struct的大小:https://github.com/Tencent/xLua/blob/master/Assets/XLua/Src/Editor/Generator.cs#L1540 但IntPtr的大小和运行环境有关。32位机器和64位机器不一样。