2011-03-02 4 views
4

이 질문 자체가 중복되지 않기를 바랍니다. 그러나 검색어가 너무 모호하므로 더 나은 것을 생각할 수 없습니다. 그래서 컴파일러는 몇 가지로 모두를 치료 않습니다, 그들은 같은이야,컴파일러는 구조가 동일한 클래스를 축소합니까?

class FloatRect 
{ 
float x,y,width,height; 
}; 

다른 곳 실용적인 관점에서

class FloatBox 
{ 
float top,left,bottom,right; 
}; 

: 어쨌든

, 이제 우리는 두 개의 클래스가 있다고 가정 해 보자 typedef의 종류? 두 개의 코드 단위가 생성됩니까?

저는 typedef를 뛰어 넘어 가독성을 높이기 위해 몇 가지 변형을 만들고 싶습니다. 궁금합니다. 불필요한 중복을 원하지는 않지만 ...

건배!

+2

불구하고 복사 할 이유/붙여 넣기가되지 않습니다 클래스 및 결과에서 클래스 또는 개체를 원격으로 닮은 것은 아무것도 없을 것입니다 ... – delnan

+0

@delnan : 그는 결과 코드의 내부가 아니라 컴파일러 내부를 의미한다고 생각합니다 (클래스 유형이없는 경우 더 이상 존재). –

+0

사과, 나는 오히려 나쁘다고 말했지만, 주로 출력 코드에 중복이 있는지 알고 싶었지만 두 경우 모두 지금 다루었습니다. 최종 코드 == 메모리 오프셋, 컴파일러 == 두 가지 유형. 감사! – Erius

답변

2

이것은 구현에 따라 다릅니다.

예를 들어 내가 한 번보기의 두 점을 설명하기 위해 그 소리/LLVM을 사용할 수 있습니다

  • 그 소리는 C++ 프론트 엔드, 그것은 기능 등 ... 그리고 치료를 호출 해결하기 위해 두 가지 유형을 사용 그것들은 전혀 다른 값을 가지고 있습니다.
  • LLVM은 옵티 마이저 백엔드로서 이름에 대해서는 신경 쓰지 않고 구조적 표현 만하므로 단일 유형으로 붕괴됩니다. 편치 않은.

질문에 대한 경우 : 유사 마련 아웃 클래스를 도입 않는다는 응답이 아니오이다, 오버 헤드 생성, 그래서 당신이 필요로하는 클래스를 작성합니다.

참고 : 최적화가 엄격한 코드를 얻을 동일한 기능의 블록을 병합 할 수 있습니다 즉, 동일, 기능 발생,이 다음 중 하나를 사용하여 일부 코드를 컴파일

1

아니요. 그대로 문자 그대로 2 가지 유형입니다. 컴파일러는 이러한 방식으로이를 처리해야합니다. 마법 병합이 없습니다.

+0

그래서, 당신은 "아니오"를 의미합니까? –

+0

좋은 지적. 고맙습니다. – EvilTeach

+0

잘못하면 llvm이 내부적으로 병합합니다. –

2

이들은 컴파일러와 관련하여 완전히 관련이없는 클래스입니다.

단지 POD C 구조체 인 경우 실제 코드를 생성하지 않습니다. (예, 자동 할당 연산자와 일부 다른 함수가 있지만 실제로 컴파일 된 코드가있을 것입니다. 사용되는 경우 인라인됩니다.)

+0

모든 컴파일러에 대해? 이걸 보장 할 수 있니? –

+1

@Tomalak : 컴파일 과정에서 프로그램에 어떤 일이 일어나는지에 대해서는 아무 것도 보장 할 수 없습니다. 이 표준은 입력이 어떻게 보이는지, 런타임에 프로그램이 어떻게 동작하는지 (필자가 정확하게 기억한다면 컴파일러가 제공해야하는/제공해야하는 진단)를 설명합니다. – delnan

+0

@delnan : 수정하십시오. :) 내 질문은 수사적이었습니다. 실제로 CashCow가 그의 대답이 정확하다는 것을 보장 할 수 없기 때문입니다. –

2

샘플로 사용하는 클래스는 컴파일하는 동안에 만 관련이 있으므로 복제하거나 붕괴 할 것이 없습니다. 런타임에서 멤버 변수는 "오프셋 N의 값"으로 액세스됩니다.

+0

OP는 컴파일러의 내부를 의미하며 출력 코드 내부가 아닙니다. –

2

물론 이것은 구현에 매우 중요합니다.

여기서 내부적 인 붕괴는 컴파일러의 메커니즘 내부에 있으며 생성 된 번역 된 코드에는 영향을 미치지 않습니다.

나는이 상황이 실제로 일어날 것 같지 않다고 생각한다. 아무런 이익이 없다고 생각할 수도 있고, 여러 가지 방법으로 문제를 복잡하게 만들 수도있다. 나는 어떤 증거도 제시 할 수 없다.

+0

@downvoter : 의견을 남겨주세요. –

1

아니요 유형이 다르며 함수 오버로딩에 사용할 수 있으므로 typedef로 처리되지 않습니다.

반면에 유형에는 코드가 없으므로 복제 할 것이 없습니다.

관련 문제