【发布时间】:2014-10-01 16:31:12
【问题描述】:
为了减少我正在开发的库的维护,我试图将类似的功能委托给单个函数。例如,假设一个有两个分量向量,其中 Add 函数接受 by-ref args 和其他接受 by-value args。这个想法是在按值函数中简单地调用 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,这意味着无法使用激进的内联。
【问题讨论】:
-
对于 SO 的新手(可能还有很多普通用户),这是一篇经过深入研究的帖子!很高兴有你在这里!
-
-Patrick 谢谢,但我实际上不是第一次使用(我早就忘记了我原来的帐户详细信息)。 -DMAN 积极内联在 4.0 中不可用,这是当前的最低要求。
-
请在您的问题中提及此要求,以防止误解。删除了我的标志。