2013-02-22 3 views
0

는 내가 구조체는 다음과 같은 정의한 경우 :컴파일러가 크기 0의 구조체를 최적화합니까?

struct blank { 
    int : 0; 
}; 

윌 컴파일러 최적화이 멀리 런타임에 아무것도?

내가 묻기 때문에 this rather popular SO question입니다. 내 자신의 C/C++ 코드에서 비슷한 컴파일 타임 검사를 사용하고 싶습니다. 가능한 한 최적의 프로그램을 만들기 위해 노력하고있어 컴파일 타임 검사에만 사용한다면 런타임시에이 빈 구조체가 필요하지는 않습니다.

참고로 링크와 동일한 결과를 달성하는 C++ 관용적 방법이 있습니까?

+0

C는 어떤 컴파일 타임 확인을 허용합니까? 이것은 C++의 유일한 질문 인 것 같습니다. – Potatoswatter

+1

@Potatoswatter : C __does__는 컴파일 시간 검사를 허용합니다. 예를 들어, C에서 정적 어설 션을 구현할 수 있습니다. –

+3

프로파일을 작성하여 프로그램이 빈 구조체의 인스턴스를 생성하는 데 많은 시간을 소비했는지 확인 했습니까? 그렇지 않다면 * 왜 당신은 신경을 쓰나요? * –

답변

5

C++는 개체가 기본 클래스를 구현할 때만 최적화를 허용합니다. 따라서 빈 기본 최적화 또는 EBO라고합니다. 단독 객체이거나 다른 객체 인 struct의 경우 해당 바이트가 단지 패딩 인 경우에도 1 바이트 이상이어야합니다.

링크 된 질문과 같은 구문에 대해서는 걱정하지 마십시오. 그곳에는 어떤 물체도없고 오직 하나의 물체 만 존재합니다. 객체가 있더라도 링커가 제거합니다. 참조되지 않은 함수와 전역 객체는 특별히 모든 것을 내보내려고하지 않는 한 실행 파일에 들어 가지 않습니다. 이 경우에도 여전히 이름을 지킬 필요가 있습니다.

다른 언급처럼, C++ 11 방식은 static_assert입니다. 오류 메시지가 필요합니다 :

static_assert(condition, "Error: condition was false."); 
2

에 따라 다릅니다. as-if rule에 의해이 구조체의 모든 인스턴스가 완전히 제거 될 수 있으면 컴파일러에서 해당 최적화를 수행 할 수 있습니다. 컴파일러가 어떤 컴파일러인지에 따라 달라지며 옵티 마이저 설정에 따라 달라집니다.

실제로 모듈 경계를 가로 질러 struct 인스턴스의 주소를 전달하는 것은 전체 프로그램 최적화 기가 캐치하지 않는 한 적어도 1 바이트의 크기로 RAM의 인스턴스를 구체화하는 매우 확실한 방법입니다. 따라서 다른 struct 또는 class의 구성원 유형으로이 struct을 사용하고 있습니다.

+0

@ LokiAstari : 그렇습니다.하지만 주소를 사용하지 않으면 옵티마이 저는 인스턴스를 제거 할 수 있습니다. 결국 아무 것도 할 수 없으므로 실제로는 코드가 없습니다. –

2

빈 구조체는 고유 한 주소를 가질 수 있습니다.하지만 그것에 관한 내용입니다. 빌드하는 데 시간을 낭비하지 않아도됩니다 (결국 비어 있으며 빌드 할 것이 없습니다).

같은 일을하는 C++의 관용적 인 방법은 static_assert (C++ 11 표준을 준수하는 컴파일러에서 사용 가능)을 사용하는 것입니다.

+0

http://stackoverflow.com/questions/621616/c-what-is-the-object-of-a-empty-class-class는 여기서 정당화됩니다. – Alex

관련 문제