* Question (김현수)

조교형들이 올려주신 프로그램상에서는 pidx를 클래스내에서
 
TelPhoneBook() : pidx(0)            

위와 같이 변수를 함수처럼 사용한 부분이 있는데 int pidx = 0; 과 비교해서

어떤 차이가 있는지 그리고 위와같은 사용은 c에서는 본적이 없는데

약간의 문법적인 내용까지 알려주시면 감사하겠습니다...

그럼 수고하십시오~~~~^^;


* Answer (박성환)

저희 조교들도 이번기회에 정확히 배우고자

교수님께 직접 문의를 드렸습니다.

알고보니, 저희가 모르는 심오한 세계가 또 있더군요...

(정말, 배움의 길은 끝이 없나 봅니다... 에궁... 어려버~)

생성자에

class A
{
   C c;
   A(C c1) : c(c1)
  {
  }
}

을 A로 하고,

class B
{
  C c;
  B(C c1)
  {
     c = c1;
  }
}

을 B라고 하면, 실제로 엄청난 차이가 있었습니다.

머, 위의 예 보다는 멤버변수가 또 다른 Class일 때 특히 그런데요,

실제로 Compile을 하게 되면, A와 같은 경우에는 Machine Code가 확연히 줄어들게 됩니다.

즉 C라는 Class를 인자로 받아 대입하게 되면, B와 같은 경우에는

복사생성자가 호출이 됩니다.

실제로 C 객체가 생성이 된 뒤 B class의 C class부분에 복사생성자로 초기화가 진행됩니다. (Memory가 한번 더 할당이 된다는 걸 아시겠죠?)

하지만, A의 경우 A class의 생성자가 호출이 되면, A Class의 C Class부분은 곧바고 C Class의 생성자로 초기화를 하게 됩니다.
(Memory가 순수 A class 만큼 할당이 된다는 걸 아시겠죠?)

때문에 두 코드에는 심오한 차이가 존재했습니다.

위와 같은 경우에는 Memory에도 차이가 나겠지만,

중요한 것은 Machine Code의 양이 줄어든다는 것입니다.

복사생성자가 호출되지 않는 (기본 Type 등등) 경우에는 실제 Memory는 별 차이가 없게 되지만,

Machine Code는 차이가 나게 됩니다.



최근에는 Compiler가 급속한 성장을 하여 기본 type에는 큰 차이를 보이지 않습니다. Compiler에게 "-o" 옵션을 주면 최적화를 진행하게 되는데,

이때 기본 type같은 경우 B경우를 A와 같은 처리를 하여 Machine code를 알아서 줄여주는등, 알아서 변환을 하게 됩니다.



머, 사용하는 입장에서는 큰차이가 없지만, 중요하게 알아두시면 좋을 것 같네요.

왜? C class의 크기가 대용량의 크기를 가진다고 가정해 봅시다...

B와 같이 사용하면... 우리가 모르는 사이에... Program이 죽어버릴지둥...

@^-^@

이런 지식하나하나가 학원에서는 절대 배울 수 없는 지식이겠죠?

잘 알아두시길 바랍니다~

그리고, 현수에게 고맙네요~ 덕분에 좋은것을 알게 되어서~ 쌩유~

@^-^@

+ Recent posts