gpt4 book ai didi

c# - 为什么 C# 不使用结构参数内联函数?

转载 作者:太空狗 更新时间:2023-10-29 23:35:41 26 4
gpt4 key购买 nike

http://blogs.msdn.com/ericgu/archive/2004/01/29/64717.aspx ,我们了解到 C# 不会内联使用结构作为形式参数的方法。这是由于对堆栈的潜在依赖,例如递归?如果是这样,我可以像这样将结构参数转换为 ref 参数吗?

public int Sum(int i)
{
return array1[i] + array2[i];
}

变成:

public int Sum(ref int i)
{
return array1[i] + array2[i];
}

编辑:我去尝试了一个测试,但我无法获得内联的任何东西。这是我尝试过的:

class Program
{
private static string result;
static void Main(string[] args)
{
Console.WriteLine(MethodBase.GetCurrentMethod().Name);
Console.WriteLine();
m1();
Console.WriteLine(result);
}
private static void m1()
{
result = MethodBase.GetCurrentMethod().Name;
}
}

它在第二行打印“m1”,表明它没有被内联。我构建了一个发布版本并使用 Ctrl-F5 运行它(不附加调试器)。有什么想法吗?

最佳答案

正如乔恩所说,这是一篇非常古老的帖子。我可以在以下代码中确认这一点:

using System;
using System.Runtime.CompilerServices;

struct MyStruct
{
public MyStruct(int p)
{
X = p;
}
public int X;

// prevents optimization of the whole thing to a constant.
[MethodImpl(MethodImplOptions.NoInlining)]
static int GetSomeNumber()
{
return new Random().Next();
}

static void Main(string[] args)
{
MyStruct x = new MyStruct(GetSomeNumber());
// the following line is to prevent further optimization:
for (int i = inlinetest(x); i != 100 ; i /= 2) ;
}

static int inlinetest(MyStruct x)
{
return x.X + 1;
}
}

inlinetest 方法是内联的。

主要方法反汇编:

; set up the stack frame:
00000000 push ebp
00000001 mov ebp,esp

; calls GetSomeNumber:
00000003 call dword ptr ds:[005132D8h]

; inlined function:
00000009 inc eax

; the dummy for loop:
0000000a cmp eax,64h
0000000d je 0000001B
0000000f sar eax,1
00000011 jns 00000016
00000013 adc eax,0
00000016 cmp eax,64h
00000019 jne 0000000F
0000001b pop ebp
0000001c ret

我已经在 Windows 7 x64 RC 上的 x86 .NET Framework 3.5 SP1 上对此进行了测试。

正如我所相信的那样,使用 struct 参数内联方法本身并没有错。可能是当时JIT还不够聪明吧。

关于c# - 为什么 C# 不使用结构参数内联函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1049564/

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