* 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이 죽어버릴지둥...
@^-^@
이런 지식하나하나가 학원에서는 절대 배울 수 없는 지식이겠죠?
잘 알아두시길 바랍니다~
그리고, 현수에게 고맙네요~ 덕분에 좋은것을 알게 되어서~ 쌩유~
@^-^@
조교형들이 올려주신 프로그램상에서는 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이 죽어버릴지둥...
@^-^@
이런 지식하나하나가 학원에서는 절대 배울 수 없는 지식이겠죠?
잘 알아두시길 바랍니다~
그리고, 현수에게 고맙네요~ 덕분에 좋은것을 알게 되어서~ 쌩유~
@^-^@
'도서관 I > Standard C & C++' 카테고리의 다른 글
[펌] __FILE__ , __FUNCTION__ , __LINE__ 매크로 (0) | 2007.08.30 |
---|---|
[펌] 동적 디버깅 __FILE__ , __LINE__의 활용 (0) | 2007.08.30 |
[바람이] Release 버젼을 위한 효율적인 Debugging 코드 작성법 (0) | 2007.07.09 |
[펌] 컴퓨터가 이해할 수 있는 코드는 어느 바보나 다 짤 수 있다. 좋은 프로그래머는 사람이 이해할 수 있는 코드를 짠다. (0) | 2007.06.27 |
[바람이] 문자열 관련 함수 (0) | 2005.08.22 |