문제

이 견적을 확인하십시오 여기, 페이지 하단을 향해. (나는 인용 된 의견을 믿는다 constS에 적용됩니다 invariants도)

열거는 최종 출력 객체/라이브러리/실행 파일의 공간을 소비하지 않는다는 점에서 구성원과 다릅니다.

분명히 value1 실행 파일을 부풀릴 것입니다 value2 문자 그대로 취급되며 객체 파일에는 나타나지 않습니다.

const int value1 = 0xBAD;
enum int value2 = 42;

C ++로 돌아가서 나는 항상 이것이 유산 이유와 상수를 최적화 할 수없는 오래된 컴파일러라고 가정했습니다. 그러나 이것이 여전히 D에서 사실이라면, 이것 뒤에 더 깊은 이유가 있어야합니다. 누구든지 왜 그런지 아십니까?

도움이 되었습니까?

해결책

C ++에서와 마찬가지로, d의 열거는 "보존 된 정수 문자 그럴"인 것 같습니다 (편집하다: 놀라운 D2도 지원합니다 부유물과 줄). 열거 자에는 위치가 없습니다. 그들은 정체성이없는 가치로서 중요하지 않습니다.

자본 매출 enum D2에서 새로 사용됩니다. 먼저 새로운 변수를 정의합니다. LValue가 아닙니다 (따라서 주소도 취할 수 없습니다). an

enum int a = 10; // new in D2

처럼

enum : int { a = 10 }

내가 가난한 D 지식을 믿을 수 있다면. 그래서, a 여기에는 LValue가 아닙니다 (위치가없고 주소를 취할 수 없습니다). 그러나 const, 가지다 주소. 글로벌이있는 경우 (올바른 D 용어인지 확실하지 않은 경우) const 변수가있는 경우, 컴파일러는 일반적으로 변수에 액세스 할 수있는 모듈이 어떤 모듈이 해당 변수에 액세스 할 수 있는지 또는 주소를 사용할 수 있는지 알지 못하기 때문에이를 최적화 할 수 없습니다. 따라서 스토리지를 할당해야합니다.

컴파일러는 로컬 Const가 있다면 컴파일러는 C ++에서와 마찬가지로 여전히 최적화 할 수 있다고 생각합니다. 컴파일러는 누군가가 주소에 관심이 있는지 또는 모든 사람이 그 가치를 취하는지 여부를 범위를 보면서 알고 있기 때문입니다.

다른 팁

당신의 실제 질문; Enum/const가 C ++에서와 동일한 이유; 답이없는 것 같습니다. 슬프게도이 선택에 대한 합당한 이유는 없습니다. 나는 이것이 사실상 패턴이 된 C ++에서 의도하지 않은 부작용이라고 생각합니다. D에서 동일한 패턴이 필요했고 Walter Bright는 C ++에서와 같이 수행해야한다고 결정하여 그 장소에서 오는 사람들이해야 할 일을 인식 할 수 있도록하기로 결정했습니다. 이 usecase에 대한 열거 대신.

좋은 컴파일러/링커는 여전히 상수를 제거해야한다고 생각합니다. 그것은 단지 열거적인 것만으로도 실제로 사양에서 보장됩니다. 차이점은 주로 의미론의 문제입니다. (또한 2.0은 아직 완료되지 않았 음을 명심하십시오)

진정한 목적 enum 단일 매니페스트 상수를 지원하기 위해 구문 적으로 확장되면, 내가 이해 한 바에 따르면, 템플릿 전문가 인 Don Clugston은 템플릿으로 미친 일을하고 있다는 것입니다. 그는 컴파일러가 Const 변수에 대한 내부 데이터 스트루 커트를 계속 만들었 기 때문에 긴 빌드 시간, 어리석은 컴파일러 메모리 사용법 등을 계속 실행했습니다. 열거와 비교하여 const/불변 변수에 대한 한 가지 주요 점은 const/불변 변수가 lvalues이며 주소를 잡을 수 있다는 것입니다. 이것은 컴파일러에 대한 여분의 오버 헤드가 있음을 의미합니다. 이것은 일반적으로 중요하지 않지만 Const 변수가 최적화 되더라도 Const 변수가 여전히 복잡한 컴파일 타임 메타 프로 그램을 실행할 때는 여전히 컴파일 타임에서 중요한 오버 헤드입니다.

Enum 값이 Const가 실제로 저장소를 가져갈 수있는 표현식에서 "인라인"으로 사용되는 것처럼 들립니다.

이것은 c#의 const 대 readonly의 차이와 유사합니다. 전자는 컴파일 타임 상수이며 나중에는 런타임 상수입니다. 이것은 확실히 어셈블리의 버전 관리에 영향을 미쳤습니다 (Readonly를 참조하는 어셈블리는 컴파일 시간에 사본을 받고 참조 된 어셈블리가 다른 값으로 재건된다면 값을 변경하지 않기 때문에).

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