2010-12-04 4 views
2

C++ 03정의 구현의 어느 정의, 지정되지 않은 행동

$ 5.3.3/2 - "가장 파생 클래스의 크기가되어야한다 제로보다 큰 (1.8)."

$ 1.8/4 - "는 비트 필드 (9.6)가 아니라면, 가장 유래 객체 0이 아닌 크기를 가지며 저장 하나 이상의 바이트를 차지한다."

내 질문은 다음과 같습니다

이 지정되지 않은 빈 클래스, 실현하는 것이의 크기 정의? 컴파일러 설명서에 문서화되어 있어야합니까? 이 두 인용문은 제 이해가 정확할 때까지 끝까지 열어 둡니다.

답변

4

지정되지 않았습니다 (단, 0보다 커야 함). 정의 된 구현이 아니기 때문에 (문서화 할 필요가 없습니다.)

빈 클래스에 대해 1 이외의 다른 크기를 사용하는 이유가 확실하지 않습니다 ("빈 클래스"로 가정하면 다른 클래스에서 파생되지 않은 클래스에 대해서도 말합니다). 그러나 그럴 수 있다고 가정 해 봅시다. 이 (정의 구현 반대) 지정되지 않은 행동이 있다고 판단 무엇


약 Chubsdad의 문제를 해결하기 위해 :

표준과 같이 "지정되지 않은 동작을"정의 : A에 대한,

행동 잘 구성된 프로그램 구조와 올바른 데이터, 이는 구현에 달려있다. 구현은 어떤 동작이 발생하는지 문서화 할 필요가 없습니다.

그것은 같은 "구현 정의 동작"정의 각 구현 기록한다 구현 및 에 따라 잘 구성된 프로그램 구조 및 정확한 데이터를 들면

동작

두 가지의 유일한 차이점은 구현 정의 동작을 문서화해야한다는 것입니다. 표준은 행위가 문서화되어야 할 때를 말할 것이다. (대개 행동이 구현에 의해 정의된다고 말하면서)

불행하게도, 표준은 항상 행동이 지정되지 않았거나 정의되지 않았 음을 직접적으로 기술하지 않는다.

  • 어떻게 그 값을 말하지 않는다, sizeof 빈 클래스의 0보다 큰 결과로 평가되어야

    • 것을 :

      표준 말한다 이후 : 그래서, 일부 분석은 순서에 여야 (이외의 0보다 큰)

    • 이 값이 기록되어야한다는 것을 언급하지 않는 (또는 구현에 정의되어 있음), sizeof의 전각이 제거 프로세스에 의해

    pty 클래스가 지정되지 않았습니다.

    이 분석의 가능한 문제점 (그리고 C++ 표준과 같은 복잡한 분석 많은)은 빈 클래스의 크기가 필요할 수도있는 놓친 표준의 다른 모서리가있을 가능성이 있습니다 구체적인 가치가있다. 그리고 그 요구는 다른 규칙들로부터 추론 (또는 공제가 될 것인가?) 일 수도있다. 그것은 명백하게 진술되지 않을 수도있다. 특정 문제에 적용될 수있는 표준의 모든 영역을 추적하는 것이 항상 쉬운 것은 아닙니다.

    그런 경우라면 누군가가 그 사실을 메모하고 내 주장을 털어 버릴 것입니다.

  • +0

    클래스 및 구조체 레이아웃은 일반적으로 시스템 단어 크기로 채워 지므로 일반적인 아키텍처에서는 4 크기가 더 많이 사용됩니다. –

    +0

    그 결론은 나의 질문인가? 그것은 열린 마음으로 끝이났습니다. – Chubsdad

    +0

    0이 아닌 것으로 지정되었습니다. :) – MSN

    1

    대부분의 파생 유형은 클래스 유형의 완전한 객체 (1.8 표준 C++ 표준 (intro.object))를 의미합니다. 따라서 인스턴스화 된 빈 클래스에는 고유 한 주소가 있어야하며 이는 sizeof(empty class)>0을 의미합니다. 그러나 이는 또한 0 크기의 기본 클래스를 가질 수 있음을 의미합니다 (C++ 표준 1.8에서도).

    빈 클래스를 인스턴스화해야하는 경우 크기가 0 일 수 없습니다. 이것이 기본 클래스 하위 객체 인 경우 0 크기를 가질 수 있습니다.

    +0

    0의 경우를 Standard parlance IMO에서 하위 객체라고합니다. 내 의심은 가장 파생 된 객체에 관한 것입니다. – Chubsdad

    관련 문제