gpt4 book ai didi

c# - 将值参数委托(delegate)给接受 ref 参数的函数

转载 作者:太空狗 更新时间:2023-10-29 17:58:12 26 4
gpt4 key购买 nike

为了减少我正在开发的库的维护,我试图将类似的功能委托(delegate)给单个函数。例如,假设有一个双分量向量,其中 Add 函数接受按引用参数,而其他函数接受按值参数。这个想法是简单地在按值函数中调用 by-ref 函数,这样就只需要维护 by-ref 函数。

struct Vector2
{
public float X;
public float Y;

public Vector2(float x, float y)
{
this.X = x;
this.Y = y;
}

public static void Add(ref Vector2 a, ref Vector2 b, out Vector2 result)
{
result.X = a.X + b.X;
result.Y = a.Y + b.Y;
}
public static Vector2 Add1(Vector2 a, Vector2 b)
{
Add(ref a, ref b, out a);
return a;
}
public static Vector2 Add2(Vector2 a, Vector2 b)
{
a.X += b.X;
a.Y += b.Y;
return a;
}
}

问题是 by-ref 重载函数不是内联的,导致我认为是较慢的代码(不包括 nops)。

启用 JIT 优化后发布输出:

添加 1:

          Add(ref a, ref b, out a);
0000002b lea eax,[ebp+10h]
0000002e push eax
0000002f lea ecx,[ebp+10h]
00000032 lea edx,[ebp+8]
00000035 call FFEDA508
0000003a nop
return a;
0000003b lea edi,[ebp-44h]
0000003e lea esi,[ebp+10h]
00000041 movq xmm0,mmword ptr [esi]
00000045 movq mmword ptr [edi],xmm0
00000049 nop
0000004a jmp 0000004C

添加2:

          a.X += b.X;
0000002b fld dword ptr [ebp+8]
0000002e fadd dword ptr [ebp+10h]
00000031 fstp dword ptr [ebp+10h]
a.Y += b.Y;
00000034 lea eax,[ebp+8]
00000037 fld dword ptr [eax+4]
0000003a lea eax,[ebp+10h]
0000003d fadd dword ptr [eax+4]
00000040 fstp dword ptr [eax+4]
return a;
00000043 lea edi,[ebp-44h]
00000046 lea esi,[ebp+10h]
00000049 movq xmm0,mmword ptr [esi]
0000004d movq mmword ptr [edi],xmm0
00000051 nop
00000052 jmp 00000054

有没有办法让对 Add 的调用内联?

请注意,该库需要 .NET 4.0,这意味着主动内联不可用。

最佳答案

尝试启用 aggressive inlining :

[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static void Add(ref Vector2 a, ref Vector2 b, out Vector2 result)
{
result.X = a.X + b.X;
result.Y = a.Y + b.Y;
}

它提示编译器(或 JIT 程序)内联该函数。

注意:AggressiveInlining 是 .NET 4.5 中的新内容。

关于c# - 将值参数委托(delegate)给接受 ref 参数的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25199346/

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