본문 바로가기

STUDY/C++

선언과 정의에 따른 메모리

1.Class의 정의와 메모리

클래스가 정의된 경우 : 프로세스가 아닌 컴파일러가 사용하는 메모리에 저장된다. 

class의 경우, 함수부는 Instance가 생성될 때마다 가지고 있게 된다면 굉장히 비효율적이다.

따라서 한 class의 Instance들은 코드영역에 올라간 함수를 공유한다. 

대신, 코드영역에 올라갈 때 각각의 멤버변수에 접근할 수 있도록 해당 클래스의 포인터를 받도록 변경되어 올라가게 된다. 

ex ) 

선언 : void classA::Func1 ( void );

코드영역에 올라갈 때 : void classA::Func1 ( classA* ca );

 

2. 논리 공간 

수많은 cpp 파일은 컴파일러에 의해 cpp파일에 대응되는 obj파일을 만들게 된다. 

실행파일 및 동적 라이브러리가 존재하는 가상의 논리적 공간인 '실행공간'은 오브젝트 공간들의 모임으로 이루어진다. 

상수로 초기화하는 전역변수의 경우 메모리영역이 할당되는 순간에 해당 상수값으로 초기화된다. 따라서 main이 불리기전에 이미 초기화가 된다.

 

+ 초기화되지 않은 전역변수 

int ArrayX[ 1024 * 1024 ];         // BSS

int ArrayY[ 1024 * 1024 ] = {0};  // BSS

int ArrayZ[ 1024 * 1024 ] = {1};  // Data

0으로 초기화 되어있거나, 초기화되지 않은 전역변수는 BSS(Block Stated Symbol)에 저장이 된다.

BSS영역은 실제 프로젝트에서 최종 바이너리의 크기에 영향을 준다.  

위의 코드를 실행하면 최종 바이너리가 4MB나 차지하게 되는데, 상수로 초기화된 ArrayZ 때문이다. 

ArrayZ의 초기화를 지운다면 몇KB만 차지하게 될 것이다. 

BSS영역은 특별한 값을 지정하지 않기 때문에 실행이미지의 크기에 영향이 없다.