2012-12-29 10 views
7

C에서 객체 지향 코드를 작성할 때 일반적으로 구조체 정의를 공용 함수와 함께 헤더 파일에 넣고 공용 함수를 별도의 .c 파일로 구현합니다. 이 클래스에 대해 "private"인 모든 함수에 static 키워드를 제공하고 .c 파일에서도 정적 키워드를 구현합니다. 그런 다음 공용 함수는 동일한 클래스에 속한 개인 함수를 호출 할 수 있습니다. static 함수를 사용하면 private 함수를 외부에서 호출 할 수 없기 때문에 GCC는 이러한 함수를 최적화 할 수 있습니다. 이들은 종종 인라인되고 원래 함수는 출력 개체 파일에서 완전히 삭제됩니다.C++ 개인 함수의 내부 연결?

이제 내 질문에 : 어떻게 C++ 클래스를 사용하여 동일한 작업을 수행 할 수 있습니까?

의 내가 헤더 파일이 있다고 가정 해 봅시다 :

class A { 
    int private_field; 
    int private_function(); 
public: 
    int public_function(); 
}; 

그리고 내 .cpp 파일 :

#include <iostream> 
#include "A.h" 

int A::private_function() { 
    std::cin >> private_field; 
    return private_field; 
} 

int A::public_function() { 
    return private_function() + 4; 
} 

결과 객체 파일에서를 private_function은 별도의 상징으로 남아 있으며, public_function는 private_function를 호출 (인라인되지 않음). private_function 내부 연결을 제공하고 싶습니다. 따라서 컴파일러가 C를 사용할 때와 동일한 최적화 작업을 수행 할 수 있습니다. 익명의 네임 스페이스와 정적을 사용하여 시도했지만 원하는대로 작동하지 못합니다. 올바르게 수행하는 방법, 가능합니까? 나는 GCC를 사용한다.

+1

"익명의 네임 스페이스와 정적으로 시도했지만 제대로 작동하지 않습니다." 뭐가 잘못 됐어? –

+0

귀하의 질문에 대답했지만 컴파일러는 내부 연결이 필요하지 않도록 인라인하는 것과 같은 대부분의 최적화를 수행 할 수 있어야합니다. –

+0

인라인은 때때로 (작은 기능의 경우) 수행되지만 원본은 항상 더 큰 라이브러리 크기로 유지됩니다. – Emil

답변

8

클래스 멤버는 내부 연결을 가질 수 없습니다. 표준 (9.3 절) :

네임 스페이스 범위에있는 클래스의 구성원 기능은 외부 연결을가집니다. 로컬 클래스의 멤버 함수에는 연결이 없습니다.

내부 링키지로 도우미 함수를 만들려면 비 멤버 멤버를 사용해야합니다.

static int private_function(A* pThis); 

class A 
{ 
    int private_field; 
    friend int private_function(A* pThis); 
public: 
    int public_function(); 
}; 

다음

#include <iostream> 
#include "A.h" 

static int private_function(A* pThis) 
{ 
    std::cin >> pThis->private_field; 
    return private_field; 
} 

int A::public_function() { 
    return private_function(this) + 4; 
} 

은 표준 (섹션 11.3)에서이 규칙 참고 :

먼저 친구 선언에서 선언 된 함수는 외부 링크를 가지고 있습니다. 그렇지 않으면이 함수는 이전 연결을 유지합니다.

+2

표준이 이상하다고 생각합니다. 왜 친구가 없을 때 사적 기능에 대한 외부 연계를 원하십니까? – Emil

+6

@Emil : 다른 번역 단위의 공용 멤버를 인라이닝 할 수 있기 때문입니다. 'A :: public_function'이 클래스에서 인라인으로 선언되었는지 생각해보십시오. 짧은 것이므로 컴파일러는 모든 호출 사이트에서 어떤 번역 단위로든 인라인으로 삽입하려고합니다.그러나 private_function은 모든 사이트에서 링크가 가능해야합니다. –