[c#] mscorlib의 ‘System.Boolean’은 구조체 레이아웃주기를 어떻게 피합니까?

System.Boolean참조 소스 웹 사이트 의 소스 코드에 struct Boolean포함 된 인스턴스 에는 단일 bool필드 만 포함되어 있습니다 . private bool m_value:

https://referencesource.microsoft.com/#mscorlib/system/boolean.cs,f1b135ff6c380b37

namespace System {

    using System;
    using System.Globalization;
    using System.Diagnostics.Contracts;

    [Serializable]
    [System.Runtime.InteropServices.ComVisible(true)]
    public struct Boolean : IComparable, IConvertible
#if GENERICS_WORK
        , IComparable<Boolean>,  IEquatable<Boolean>
#endif
    {
      private bool m_value;

      internal const int True = 1;
      internal const int False = 0;

      internal const String TrueLiteral  = "True";
      internal const String FalseLiteral = "False";

      public static readonly String TrueString  = TrueLiteral;
      public static readonly String FalseString = FalseLiteral;
}

그러나 나는 그것을 알아 차렸다.

  • bool이다 는 C # 언어 별칭 에 대한 System.Boolean.
  • type은 struct Booleanvalue-type 이므로 필드 자체를 포함 할 수 없습니다 .
  • …하지만이 코드는 아마도 컴파일됩니다.
  • -nostdlib컴파일러 옵션이 설정 되면 , 와 같은 필수 유형 정의 를 제공해야 한다는 것을 이해합니다 . 이것이 유일한 차이점입니다.System.StringSystem.Int32System.Exception
  • 게시 된 소스 코드에는와 같은 다른 특수 속성이 없습니다 [MethodImpl( MethodImplOptions.InternalCall )].

그렇다면이 코드는 어떻게 컴파일됩니까?



답변

짧은 답변 : 유형 권투 및 기본 표현과 관련된 특별한 경우입니다. 이러한 유형은 컴파일러에 잘 알려져 있으며 런타임의 핵심 부분과 일반 유형에 비해 컴파일러 / JIT 최적화 프로그램에서 약간 다르게 처리됩니다.


이것은 런타임 구현에 깊이 묻혀 있기 때문에 언어 사양이 특정 런타임 구현 세부 정보에 들어 가지 않을 것이라고 가정합니다. 이것이 충분한 대답인지 확실하지 않지만이 특별한 경우 bool유형은 상자에 넣지 않은 상태로 유지되므로 구조의 일부로 원시 값 유형으로 존재합니다.

값 유형의 boxing 및 unboxing 의미는 의도적으로 불투명하여 언어를보다 쉽게 ​​사용할 수 있습니다. 이 경우 Boolean구조 자체는 다음과 같은 실제 의미를 구현하기 위해 구현 별 권투 규칙에 의존하는 것 같습니다.

  // Determines whether two Boolean objects are equal.
  public override bool Equals (Object obj) {
    //If it's not a boolean, we're definitely not equal
    if (!(obj is Boolean)) {
      return false;
    }

    return (m_value==((Boolean)obj).m_value);
  }

위의 내용을 믿으면 부울 유형을 나타내는 상자 구조가 먼저 유형 검사되고 상자가 풀리고 내부 bool값이 직접 비교됩니다. 태그 된 포인터 또는 일부 런타임 유형 정보가있는 실제 구조 일 수있는 박스형 유형과 달리 박스형 유형은 실제 데이터로 처리됩니다.

내부적으로 부울이 System.Object(유형 삭제로 인해 또는 최적화가 불가능한 위치로) true전달되도록 상자에 넣어야한다면 값을 상자에 넣는 선을 따라 무언가가 생길 것 1입니다.

ldc.i4.1
box        [mscorlib]System.Boolean

따라서 하이 레벨에있는 동안 boolSystem.Boolean동일한 것으로 나타나고 런타임 내의 특히이 경우, 유사하게 최적화 될 수의 박스와 박싱 버전 사이의 차이점은 bool직접 노출된다. Similary는 언 박싱 bool캔에 비교 될 수없는 System.Object본질적으로 박스 타입이다. 복싱 / 언 박싱의 필요성에 관한이 답변 은 원칙 자체를 설명하는 한 훨씬 더 깊이있게됩니다.

관리되는 언어 런타임 구현은 일반적으로 일부 핵심 런타임 기능과 관련하여 특정 규칙에서 제외되어야합니다. 이는 Java 및 기타 JVM 기반 언어에 해당됩니다. CLR에도 익숙하지 않지만 여기에도 동일한 원칙이 적용됩니다.

반면 ‘부울’ ‘선택 System.Boolean’에 대한 유형 별칭 것에 대해이 질문은 기본적으로 일반적인 사용 사례를 다루고 런타임 구현에 가까워 때, C 번호의 사투리가 약간 규칙을 구부릴 수있는, 더 “구현 고유의 C #을”처럼된다 .


답변