[ Const 와 메모리 구조 ]

 

어떤 프로그램이 빌드가 되서 실행 파일이 만들어진 다음에 실행파일을 실행할때 메모리에 이 실행파일을 올리는데 

아래와 같은 구조로 올려진다.


데이터 영역

 

.data ( 초기값이 있는 경우 )

// int a = 2;

 

.bss ( 초기값 없는 경우)

// int b;

 

.rodata ( 읽기 전용 데이터 )

// const char* msg = "Hello World";

 

 

궁금한건 const 로 설정한 값은 어디 메모리에 올려지는가?  읽기 전용 데이터인가?

 

사실 C++ 표준에서 꼭 그렇게 하라는 말이 없다.

그냥 컴파일러 하기 나름이다 ( VS 마음 )

수업시간에 ctrl alt D 해서 디 어셈블리로 봤을때는

컴파일러가 const 값을 아무런 메모리에도 올리지 않고

 

컴파일러가 자체적으로 a 를 3으로 바꾸는걸 알 수 있었다.

const int a = 3;

 

반면에,

내가 직접 해봤을때, a 의 메모리 주소에 가서 값을 보니

 

아래와 같이 리틀 엔디안 방식으로 3 이 잡혀있는걸 확인 할 수 있었다.

 

이때는 .rodata ( 읽기 전용 데이터) 메모리에 잡힌것이다.

 

 

 

cf ) 함수 안에 변수를 선언하면 stack 메모리 영역에 올라간다. const 도 마찬가지이다.


 

 

[ 스택 프레임 ] 

 

스택 프레임 강의 다시 보기 ( 레지스터랑 메모리 랑 스택 포인터 ) 연관해서 가리켜 준다.

 

 


[ 지역 변수와 값 전달 ]


[ 호출 스택 ]

 

호출 스택을 잘 활용해라!! 중요하다

 


[ 함수 마무리 ]

 

오버로딩 : 함수 이름을 재 사용할 수 있다. ( 매개변수 갯수, 타입, 순서를 통해 ) 

 - 반환형식으로만 구분 할 수는 없다. ( 결국에는 반환은 호출한 후에 반환되는건데 호출 할 때 구분 할 수 없으니 컴파일러 입장에서는 안된다. )

 

 

함수 파라미터에 디폴트 값을 정해주려는 해당 파라미터는 항상 파라미터 끝에 위치해야한다.

void Add(int num1 , int num2 , int num3 =3 ) // 항상 끝에만 가능하다
{
~~
}

* 여러 파라미터에 디폴트 값을 두어도 된다. ( 다만 모두 뒤에 있어야한다. )

+ Recent posts