C#이 수동 인라인 메소드를 지원하지 않는 이유가 있습니까? 그리고 선택적 매개 변수는 어떻습니까?

StackOverflow https://stackoverflow.com/questions/1621623

  •  06-07-2019
  •  | 
  •  

문제

그에 대한 디자인 이유가 있습니까 (다중 상속을 포기한 이유와 같이)?

아니면 충분히 중요하지 않았습니까?

그리고 메소드의 선택적 매개 변수에 동일한 질문이 적용됩니다 ... 이것은 이미 VB.net의 첫 번째 버전에있었습니다. C# 4가 포함 할 것이기 때문에 그것에 대한 마음의 변화는 ..

누구나 결정이 무엇인지, 왜 그것을 포기했는지 아는 사람이 있습니까?

편집하다:

어쩌면 당신은 나를 완전히 이해하지 못했을 것입니다. 나는 최근에 계산 프로그램 (모든 크기의 지원 번호, 마지막 자리에 대한)에서 일하고 있는데, 일부 방법은 문자 그대로 초당 수백만 번 사용됩니다.

Add (int num)라는 메소드가 있다고 가정 해 봅니다.이 방법은 매개 변수로 1이 1 인 조용히 사용됩니다 (Add(1);), 나는 특히 하나에 대한 특별한 방법을 구현하는 것이 더 빠르다는 것을 알았습니다. 그리고 나는 과부하를 의미하지 않습니다 - Addone이라는 새로운 방법을 작성하고 문자 그대로 사용하는 대신 추가 방법을 복사합니다. num 나는 글을 쓰고있다 1. 이것은 당신에게 끔찍하게 이상하게 보일지 모르지만 실제로는 더 빠릅니다.

(못생긴만큼)

그로 인해 C#이 왜 수동 인라인을 지원하지 않는지 궁금해했습니다.

감사해요. (그리고 왜 당신은 저에게 투표 했습니까 : S)

편집 2 :

나는 이것을 추가 할 것인지 스스로에게 물었다. 나는 그러한 프로젝트를 위해 DOT NET과 같은 플랫폼을 선택하는 것의 이상 (및 단점)에 대해 매우 잘 알고 있지만 DOT NET 최적화가 생각보다 중요하다고 생각합니다. 특히 CPU 등과 같은 기능.

도움이 되었습니까?

해결책

질문의 일부에 답하려면 Eric Gunnerson의 블로그 게시물을 참조하십시오. C#에 '인라인'키워드가없는 이유는 무엇입니까?

그의 게시물의 인용문 :

C#의 경우, 인라인은 JIT 수준에서 발생하며 JIT는 일반적으로 괜찮은 결정을 내립니다.

편집 : 선택적 매개 변수 지원 지연의 이유는 확실하지 않지만, 다른 언어가 제공 한 내용에 대한 우리의 기대에 따라 구현할 것으로 예상되는 것처럼 들린다 고 말합니다. 우선 순위 목록에서는 높지 않았고 각 버전의 특정 기능을 제공하는 마감일이있었습니다. 특히 방법 과부하가 가능한 대안이기 때문에 지금까지는 중요하지 않았을 것입니다. 한편 우리는 제네릭 (2.0)과 LINQ 등을 가능하게하는 기능을 얻었습니다 (3.0). 나는 언어의 진행에 만족합니다. 앞서 언급 한 기능은 조기에 선택적 매개 변수에 대한 지원을받는 것보다 나에게 더 중요합니다.

다른 팁

매뉴얼 인라인은 거의 쓸모가 없습니다. JIT 컴파일러는 적절한 경우 기본 코드 컴파일 중에 메소드를 상감하며 거의 모든 경우에 JIT 컴파일러가 프로그래머보다 적절한시기를 추측하는 것이 좋습니다.

선택적 매개 변수는 이전 버전에 왜 없었는지 모르겠습니다. 즉, C# 4에있는 것이 마음에 들지 않습니다. 매개 변수가 소비 어셈블리로 구워지고 DLL의 표준 값을 변경하고 소비를 원한다면 다시 컴파일해야하기 때문에 다소 해로운 것으로 간주하기 때문입니다. 새로운 것을 사용하기위한 어셈블리.

편집하다:

인라인에 대한 추가 정보. JIT 컴파일러가 메소드 호출을 인화하도록 강요 할 수는 없지만 메소드 호출을 인화하지 않도록 강요 할 수 있습니다. 이를 위해 System.runtime.compilerservices.methodimplattribute를 사용합니다.

internal static class MyClass
{
    [System.Runtime.CompilerServices.MethodImplAttribute(MethodImplOptions.NoInlining)]
    private static void MyMethod()
    {
        //Powerful, magical code
    }

    //Other code
}

내 교육받은 추측 : 이전 버전의 C#에 선택적 매개 변수가없는 이유는 C ++에서의 경험이 좋지 않기 때문입니다. 표면에는 충분히 간단하게 보이지만 몇 가지 귀찮은 코너 케이스가 있습니다. Herb Sutter의 책 중 하나가 이것을 더 자세히 설명한다고 생각합니다. 일반적으로 그것은 우선적 인 것과 관련이 있습니다 virtual 행동 양식. 막시밀리안 그의 대답에서 .NET 코너 케이스 중 하나를 언급했습니다.

또한 여러 개의 과부하를 수동으로 작성하여 거의 나갈 수 있습니다. 그것은 그다지 좋지 않을 수 있습니다 작가 클래스의이지만 클라이언트는 오버로드와 선택적 매개 변수의 차이를 거의 알지 못합니다.

그래서 그들과 함께이 세월이 지나면 왜 C# 4.0을 추가 했습니까? 1) vb.net으로 패리티를 개선하고 2) Com과 더 쉽게 인터 로프합니다.

나는 최근에 계산 프로그램 (모든 크기의 지원 번호, 마지막 자리에 대한)에서 일하고 있는데, 일부 방법은 문자 그대로 초당 수백만 번 사용됩니다.

그런 다음 잘못된 언어를 선택했습니다. 나는 당신이 실제로 당신의 코드를 프로파일 링했다고 가정하고 (맞습니까?) 당신을 도울 수있는 미세 최적화와는 별도로 아무것도 없다는 것을 알고 있습니다. 또한 고성능 원시 Bigint Library를 사용하고 있으며 자신의 글을 쓰지 않습니까?

그것이 사실이라면 .NET을 사용하지 마십시오. 부분 전문화에서 속도를 높일 수 있다고 생각되면 Haskell, C, Fortran 또는 자동으로 수행하거나 손으로 할 수 있도록 Inlining을 노출시킬 수있는 다른 언어로 이동하십시오.

만약에 Add(1) 정말로 당신에게 중요합니다. 힙 할당도 중요합니다.

그러나 프로파일 러가 당신에게 말할 수있는 것을 실제로 살펴 봐야합니다 ...

C#은 4.0에 추가했습니다. http://msdn.microsoft.com/en-us/library/dd264739(vs.100).aspx

왜 그들이 처음부터 끝나지 않았는지에 관해서는 방법 과부하가 더 많은 유연성을 느꼈기 때문에 가능성이 높습니다. 오버로드를 사용하면 복용하는 다른 매개 변수를 기반으로 여러 '기본값'을 지정할 수 있습니다. 또한 그다지 더 구문이 아닙니다.

C ++와 같은 언어에서도 무언가가 발생한다고해서 그것이 일어날 것이라고 보장하지는 않습니다. 컴파일러에 대한 힌트입니다. 컴파일러는 힌트를 받거나 자체 일을 할 수 있습니다..

C#은 생성 된 어셈블리 코드 (IL + jit을 통해)에서 제거 된 또 다른 단계이므로 무언가가 인화되도록 보장하기가 더욱 어려워집니다. 또한 행동이 다른 JIT의 X86 + X64 구현과 같은 문제가 있습니다.

Java에는 포함되지 않습니다 인라인 키워드. 더 나은 Java Jits는 가상 방법조차도 인라인 할 수 없으며 다음과 같은 키워드를 사용하지도 않습니다. 사적인 또는 결정적인 차이를 만들어냅니다 (예전, 지금은 고대 역사입니다).

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top