2010-06-29 5 views
3

나는 학교에서 C++를 "학습"하지만, 컴파일러 최적화 할 수있는 또는 무엇처럼 나도 몰라 몇 가지,속성을 보호/개인용으로 설정하는 성능상의 이유는 무엇입니까?

만약 ... 내가 이미 inlineconst 조금 높일 수 있다는 사실을 알고 보인다,있다 성능은 중요한 것입니다 (예 : 게임 프로그래밍). public (private 또는 protected)이 아닌 클래스 속성을 사용하면 컴파일러가 더 최적화 된 코드를 만들 수 있습니까?

이전의 모든 선생님이 말하기를 "보안"또는 "클래스 액세스/동작을 원하지 않거나 금지하지 않으려 고했기 때문에"결국은 public이 아닌 퍼팅 속성이 범위를 제한 할 수 있는지 궁금합니다. 물건을 고정 시켜라.

나는 (내가해야) 선생님을 비판하지 않는,하지만 난에 있던 프로그래밍 클래스는 매우 고급 아니었다 ...

+1

const는 아무 것도 향상시키지 않습니다. 그리고 인라인은 일반적으로 쓸모가 없습니다. –

+0

@Alexandre : 그런 담요 진술은 확실히 사실이 아닙니다. const에 대해서는 – sbi

+2

입니다. –

답변

5

선생님은 구현을 숨기고 개인 정보를 보호하기 위해 개인 정보 보호를 사용하고 의심스러운 성능 최적화를 유도하는 대신 정보 숨김에 대해 알려주는 것이 옳았습니다. 첫 번째와 두 번째로 적절한 디자인을 생각해보십시오. 99 %의 경우 성능이 중요한 시나리오에서도 더 나은 선택이 될 것입니다. 성능 병목 현상은 예측할 수없는 많은 경우에 나타날 수 있으며 설계가 건전한 경우 훨씬 쉽게 얻을 수 있습니다.

그러나 질문에 직접 대답하려면 : 컴파일러가 범위를 축소하면 컴파일러가 특정 최적화 작업을 수행하는 데 도움이 될 수 있습니다. 멤버를 비공개로 설정하는 것과 관련하여 생각할 수없는 생각을 할 수 없습니다.

+1

나는 그들이'protected' 구현을 사용하는 것을 가르치는 것이 옳다고 말하지 않을 것입니다. 파생 클래스에 데이터를 공개하는 것은 '공개'로 만드는 것과 같습니다. 'protected'는 일부 메소드에 대해서만 가치가 있습니다. –

+1

물론 보호 된 필드에 대한 액세스 권한을 얻기 위해 특정 클래스를 상속 할 수 있습니다 (protected로 정의한 것은 구현을 숨기지 않는다고 가정합니다). 그러나 C++의 const 수정자는 const를 항상 const_cast하고 원하는대로 수정할 수 있기 때문에 const를 값을 const로 만들지 않는다고 주장하는 것과 같습니다. –

+2

C++ 액세스 제어는 "Machiavelli가 아닌 Murphy에 대한 보호"로 설명되었습니다. 그들은 그들의 의도를 문서화하고 우발적 인 위반을 방지하지만 오용을 막지는 않습니다. –

3

호 개인 회원을 만들기 또는 보호 된 모든 성능 혜택을 제공하지 않을 ; 물론 디자인에 대한 이점 (정보 숨김)은 엄청납니다.

+0

나는 어떤 혜택을 얻지 못합니까? 내 코드를 읽을 다른 사람들을 위해? 왜냐하면 나에게 내가 프로그래밍하고있는 것을 안다면 실제로 어떤 이점도 보지 못하고 그 디자인을 그렇게 대단히 좋게 만드는 것을 이해하지 못하기 때문이다. – gokoon

+1

@ gokoon : 정보 숨기기의 이점에 대한 설명은 예를 들어 Wikipedia : http : //en.wikipedia를 참조하십시오.org/wiki/Information_hiding IH는 수업의 행동에 대해 쉽게 추론 할 수 있기 때문에 스스로 프로그래밍하는 경우에도 유용합니다. 수업이 비공개 인 경우 수업 자체 만 변경했을 수 있습니다. 공개이면 문자 그대로 어디에서나 바뀔 수있었습니다. 프로젝트 규모가 커짐에 따라 점점 더 중요 해지고 있습니다. –

+1

@ gokoon : 정보 숨기기는 변경해야 할 때 유용합니다. 100,000 줄의 코드가 있고 Database :: connect()가 구현되는 방식을 변경하려고한다고 가정 해보십시오. Database 클래스의 모든 개인 데이터와 함수를 변경하고 수정할 수 있으며 Database :: connect() 호출자가이를 사용하는 방법을 볼 필요가 없습니다. –

2

일단 코드가 컴파일되면 public, privateprotected과 같은 것이 없으므로 성능에 영향을 미치지 않습니다.

const도 기계어 코드 (예 : ROM 제외)에는 없지만 컴파일러는 값이 변경 될 수 있는지 (일부 상황에서) 알면 프로그램에 대한 논리적 최적화를 할 수 있습니다.

inline은 거의 영향을 미치지 않습니다. 컴파일러는 컴파일러가 무시할 수있는 (그리고 종종 그렇습니다) 컴파일러에 대한 제안 일뿐입니다. 컴파일러는 함수가 적합하다고 생각하는대로 함수를 인라인합니다.

+0

"상황에 따라 다르다"= 가상적으로는 const 변수에 별명을 지정할 수 없기 때문에이를 반증하기가 매우 어렵습니다. –

+0

만약'const int a = 1, b = 2; int c = a + b;'a + b' 표현식은 컴파일 할 때 평가됩니다. 나는 그것이 드물다는 것에 동의하지만 자주 깨닫기에는 충분히 일어난다. –

+0

@Alexandre : 상수 개체를 수정하면 정의되지 않은 동작이 발생하므로 컴파일러는 수정할 수 없다는 것을 증명할 필요가 없습니다. –

관련 문제