
BSS
BSS는 데이터 영역 밑에 있는데, 데이터 영역의 초기화 된 변수들은 데이터 영역에,
초기화 되지 않은 변수들은 BSS에서 0으로 초기화 한 후에 다시 데이터 영역으로 옮겨진다.
힙
데이터가 위에서 밑으로(낮은 주소에서 높은 주소로) 채워진다.
스택과 마찬가지로 넘치면 오버플로우가 발생할 수 있다.
스택
데이터가 밑에서 위로(높은 주소에서 낮은 주소로) 채워진다.
후입선출의 방식으로 가장 마지막에 들어간 요소가 가장 먼저 나온다.
함수 선언부와 정의부
컴파일러가 코드를 위에서 밑으로 읽기 때문에 아직 읽지 않은 함수를 모를 수 있다.
그래서 기본적으로 함수의 선언부를 위쪽에 작성하고 정의부를 작성하는 것이 좋다.
선언부는 맨 처음 한번 초기화하고 그 후로 호출할 때는 정의부가 사용되기 때문에
디폴트 매개변수를 선언부에 작성해야 한다.
int Add(int num = 10);
int Add(int num)
{
return ++num;
}
call by value
void Add(int temp)
{
temp++;
}
void main()
{
int a = 1;
for(int i=0;i<10;I++)
{
Add(a);
cout << a << endl;
}
}
결과:1을 10번 출력한다.
위 코드와 같이 함수의 매개변수로 값을 전달 할 때 변수 a를 직접 전달하는 것이 아니라
변수 a를 복사한 값을 전달하기 때문에 Add를 해도 main함수의 a의 값은 증가하지 않는다.
이것을 call by value라고 하는데 다른 유형에 대해서도 밑에 링크에 정리했다.
[C++] Call by Value ,Call by Address, Call by Reference
Call by value double median(vector vec) 매개변수인 vec의 값을 복사해서 가져온다. 함수 안에서 vec을 변경해도 실제 vec은 변하지 않는다. Call by reference vector homework; vector& hw = homework; // hw is a synonym for homewo
cppking.tistory.com
함수의 지역 변수 반환
int getNum()
{
int a = 5;
return a;
}
void main()
{
cout << getNum(); // 5출력
}
위 코드에서는 getNum()이 5를 반환하는데 함수가 종료되기 전에 임시메모리에 값을 복사한다.
임시메모리이기 때문에 값을 반환하고 나서 삭제된다.
함수 오버로딩
int add();
int add(int num);
int add(int num1, int num2);
double add(double num1, double num2);
함수의 이름이 같더라도 매개변수의 개수와 자료형에 따라 어떤 함수가 호출될지 결정한다.
반환 타입은 함수 오버로딩의 동작원리와 무관하다.
정적 변수(static)
나는 static만 붙이면 블록 안에 있더라도 전역에서 사용할 수 있는 변수가 되는 줄 알고 있었다.
하지만 저장 영역이 데이터 역으로 같을 뿐 static을 붙이더라도 통용 범위는 지역으로 한정된다.
static int i = 3;
void main()
{
static int i = 300;
}
위 같은 코드도 가능하다.
전역에 선언된 i, main 함수에 선언된 i 둘 다 데이터 영역에 저장되지만
통용되는 범위가 다르기 때문에 이름이 같은 전역 변수와 지역 변수가 성립하는 것처럼 위 코드도 성릷한다.
void main()
{
int i;
for (i=0;i<5;i++)
PrintCount();
}
void PrintCount()
{
static int count=0;
count++;
printf("저는 %d번째로 호출되었습니다.\n",count);
}
결과:
저는 1번째로 호출되었습니다.
저는 2번째로 호출되었습니다.
저는 3번째로 호출되었습니다.
저는 4번째로 호출되었습니다.
저는 5번째로 호출되었습니다.
정적 변수의 사용예시이다.
일반 지역 변수라면 1번째로 고정되었겠지만 정적 변수이기 때문에 count가 늘어난다.
하지만 count를 printCount 외부에서 접근할 수는 없다.
이렇게 저장은 데이터 영역에 하고 싶지만 지역 안에서만 사용하기를 원할 때 static을 사용할 수 있다.
(블로그에 정적 변수에 대해 정리해 놓은 적이 있었는데 까먹었었다..)
'Today I Learned' 카테고리의 다른 글
| 23.01.20 - const와 포인터, 배열 (0) | 2023.01.20 |
|---|---|
| 23.01.19 - 포인터 기초 (0) | 2023.01.19 |
| 23.01.17 - 메모리 (0) | 2023.01.17 |
| 23.01.16 - 디버깅 고급 (0) | 2023.01.17 |
| 23.01.13 - 분기문, 난수 생성 (0) | 2023.01.13 |