C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[71454] Re:Re:구조체 선언방법에 대해 문의 사항이 있습니다.
pwrlove [pwrlove] 3397 읽음    2014-06-23 14:29
1. AAA aaa; <--이렇게도 하고
2. AAA *aaa; <--이렇게도 하고

아마도 1 과 2의 결정적인 차이는 선언된 변수가 생성되는 메모리 공간의 차이라고
하는것이 더 정확한 듯 합니다.

그냥 1번 처럼 쓰면되는데, 그럼 왜 2번 처럼 사용을 할까요?
대체적으로 그 이유는 다음과 같습니다.

우선 1번 처럼 사용을 하시게되면, 주로 메모리의 한정된 공간에 변수 영역이 잡히게 됩니다.

만약 1번의 선언이 함수 블럭이나, 지역 변수 공간에 선언된다면 분명 그 변수는 스택 메모리 공간에 확보가
될것입니다. 그런데, 이 스택은 매우 제한된 영역이고, 그래서 스택을 많이 소비하게되면 종종 프로그램이 멈추는 현상도
생기게 됩니다. 그 이유는 오토변수나, 함수 리턴 등 매우 특별한 기능을 공유하기 때문입니다.
특히 리턴으로 되돌아갈 번지를 푸쉬해 두었는데, 메모리 영역이 모자라서 침범하게되면 리턴 번지를 깨 먹을 것이고,
프로그램의 되돌아갈 메모리 위치를 잃어버려서 그런경우, 종종 공포의 블루스크린을 보게될 것입니다.
그리고, 지역블럭에서 잡힌 메모리는 그 지역을 벗어나면, 자동으로 해제된다는거 아시죠? 스택 메모리의 특징 입니다.
그 경우 다른 곳에서 참조를 하려고 하면 문제를 일으키게 되는 것이죠. 편한 부분도 있지만, 분명 수명에 매우 제한적인 자료 구조입니다. 동시에 위험성도 높고요. call by reference 할때 매우 주의가 요구되는 영역입니다.

또 다른 공간은 데이터영역이라고 하는 부분인데, 이건 주로 전역변수, 정적변수들이 잡히는 영역인데, 이것도 매우 한정적인 공간입니다.
한번 변수가 잡히면 제거할 수도 없는 곳이고요. 그래서 무한정 쓸 수 있는 공간이 아닙니다.

그렇다면, 이제 남은 곳은 힙 영역 일텐데, 질문하신 분께서는 아무래도 메모리를 재 사용하고 싶겠지요?
쓰고나서 시스템에 반환하고, 필요할때 또 사용하는 그런 마법같은 공간 -> 그게 바로 힙영역 입니다.

힙영역을 사용하려면, 반드시 2번과 같이 선언하시고, new/delete, malloc/free를 써야만 하는 것입니다.
이걸 바로 동적할당이라고 합니다.

힙의 장점은 무엇보다도 개발자의 의도대로 메모리 변수의 수명을 임의로 조절할 수 있다는 것입니다.
해제하기전까지는 무조건 값이 유지될 것이기 때문이죠. 물론 양날의 칼, 이게 메모리 누수를 일으키는 단점도 있죠.
그리고 가변적이기 때문에 관리만 잘 하면 제약없이 메모리를 사용할 수 있는 공간입니다.

그 경우를 위해서는 무조건 2번만 가능합니다.

반드시 2번을 써야하는 또 다른 경우는 함수의 인자 부분을 넘기는 경우 입니다.
예를 들면   long func(AAA a) -> long func(AAA* p)
이 둘의 차이를 아십니까?

물론 좌측처럼 사용해도 동작에는 이상이 없습니다.
종종 좌측처럼 사용하는 경우도 있습니다.
그 것은 인자에 데이터를 몽땅 복사해서 넘기는 경우 입니다 (뭐, call by value) 라고도 합니다.
그런데, 그런 경우 아니라면 일반적으로 우측처럼 사용을 해야합니다.

이 부분은 call by reference 의 내용도 있겠지만,
그 보다도 아까 위에서 이야기했던 스택 메모리 공간과 밀접한 관련이 있습니다.

우선 좌측처럼 했을 경우, 구조체 a 인자를 몽땅 스택에 복사를 해서 인자로 넘김니다.
만약 구조체 어레이일 경우, 데이터가 많다면, 스택메모리에 몽땅 복사를하게 될 것이고, 이게 스택을 매우 많이 소비하게됩니다.
그 경우 어떤 문제가 생길 수 있는지 위에서 말씀드렸지만, 그 외에도 복사하는 속도도 만만치 않을 것입니다. 경우에 따라서
바로 이 경우 함수의 인자에 2번의 표현을 많이 사용하게 됩니다.
인자가 포인터 이니까, 4바이트(32비트 기준)만 스택에 복사해서 넘기면 되는 거죠.
스택소비 / 복사속도 두 마리의 토끼를 동시에 잡는 거죠.

이런 부분은 포인터 활용에 대한 정리를 잘 해 주셔야 합니다.

도움이 되시길 바랍니다.


: 구조체 님이 쓰신 글 :
: :
: : struct AAA
: : {
: :     int a;
: :     int b;
: : );
: : 

: :
: : AAA구조체를 만들고
: :
: : 선언을
: :
: : 1. AAA aaa; <--이렇게도 하고
: : 2. AAA *aaa; <--이렇게도 하고
: : 3. AAA *aaa = new AAA <--이렇게도 하는데
: :
: : 어느걸 선언하던지
: : aaa->a = 1;  (aaa.a = 1;)
: : aaa->b = 2;  (aaa.b = 2;)
: :
: : 이런식으로 다 사용이 가능한데요
: :
: : 세번째 new해서 메모리 공간을 생성 하는건 delete하기 전까지 계속 쓰겠다는 의도인거는 알겠는데요
: : 첫번째 선언과 두번째 선언은 그냥 개발자 맘대로 선언하는건가요??
: :
: : 서로 차이점을 알려주시면 감사하겠습니다.
: :

+ -

관련 글 리스트
71448 구조체 선언방법에 대해 문의 사항이 있습니다. 구조체 3067 2014/06/20
71450     Re:구조체 선언방법에 대해 문의 사항이 있습니다. 빌더초보 3103 2014/06/21
71454         Re:Re:구조체 선언방법에 대해 문의 사항이 있습니다. pwrlove 3397 2014/06/23
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.