C++

C++ 스터디 3주차 과제 1

kchabin 2022. 5. 6. 22:52

3주차 배운 것: 포인터, 참조

 

변수 : 특정 값을 담은 상자 같은것.

포인터 변수 : 변수의 주소를 담고 있는 주소록과 같다. 

 

예를 들어, 2라는 이름의 사람이 살고 있는 집이 n이고, 그 n의 주소가 100번지라고 하면, 주소록 p 안에는 n의 주소 100d이 기록돼있는거라고 보면 된다.

예시 그림

 

포인터 선언 및 초기화에는 분리형과 선언형이 있는데, 그냥 한 줄이냐 두 줄이냐의 차이다. 

int만 선언하는게 아니라 char, double 등 다양한 자료형을 사용할 수 있는데, 이렇게 포인터 변수에 자료형을 선언하는 이유는 이 자료형이 가리키는 변수의 데이터를 읽을 때 몇 바이트를 읽을지 결정하는 요소이기 때문이다.

sizeof 함수를 이용해서 바이트 크기 확인

종류 자료형 크기
  char 1
  short 2
정수형 int 4
  long 4
  long long 8
실수형 float 4
  double 8

자료형마다 할당되는 메모리의 크기가 다르다.

포인터 변수 자체의 크기는 모두 4바이트로 동일하다. 

 

포인터 변수와 배열

 

배열은 데이터형의 크기만큼 각 원소가 메모리를 차지한다. 배열들의 각 원소가 연속적으로 놓이게 되기 때문에 원소 접근 시 *(포인터 변수 +1) 이런 식으로 표현할 수 있다. 

첫번째로부터 n만큼 떨어진 원소는 *(포인터 변수 +n)으로 표현

 

*x : m[0]

x : 100번지 

(x+1) : 104번지 

(x+2) : 108번지

 

데이터형의 크기 만큼 메모리를 차지하기 때문에 포인터 변수가 +1되면 주소값은 자료형의 크기만큼 늘어난다.

int형의 크기가 4바이트니까 주소값이 4만큼 늘어나는 것.

 

참조

가리킨다는 뜻. 이미 존재하는 변수에 대한 별명.

메모리에 새로운 공간을 할당하지 않는다. 

기존 변수를 그대로 대신하여 사용되는 역할.

 

한마디로 기존 변수의 대리자다. 함수 호출 방식 중 하나인 참조에 의한 호출로 유용하게 쓰인다.

포인터 변수 참조자
1. 메모리에 별도의 공간을 할당한다. 
-초기화 전 선언 가능, NULL 초기화 가능

2. 주소값을 통한 데이터 접근 가능, 내용 변경 가능. 

3. 포인터를 통해 배열 구조 내
다른 인덱스의 메모리에 접근 가능.

1. 별도의 메모리 공간이 할당 되지 않아서 선언과 동시에 초기화 해줘야한다. NULL초기화는 불가능하다. 단독으로 존재할 수 없기 때문에 빈 공간으로 둘 수 없다.


2. 대리자 역할이기 때문에 내용은 변경할 수 없다. 

3. 메모리 주소 접근 불가능 -> 안정성 Good

대상의 내용 변경이 가능한 포인터 변수

 

 

 

함수 호출

함수 호출 시 인자 전달 방식

 

Call by value

1. swap 함수를 호출하면서 넣어준 m, n의 값이 매개 변수인 a, b로 복사되어 넘어간다.

2. 함수 내부 과정 수행 -> 지역변수 a, b의 값이 서로 바뀐다.

3. main 함수로 돌아와서 함수 호출 이후의 m, n 값을 호출한다. 

 

값이 복사되어 넘어갔을뿐이지 m과 n의 값 자체가 바뀐 것은 아니다. 

함수 내부에서만 바뀐다.

 

Call by address (주소를 불러옴.)

 

포인터 변수가 인자들을 제어한다.

실제 저장값 변화 o

변수를 선언할 때 포인터 변수로 선언한다. 인자도 주소값을 줘야하기 때문에 swap(&m, &n) 이런 식으로 써야한다.

 

Call by reference (참조자 변수)

이것도 포인터 변수 선언했던 것처럼 하면된다. 다만 매개 변수 선언 할 때 &만 붙여준다.

 

  Call by value Call by adddress Call by reference
함수의 매개변수 타입 일반 변수 포인터 변수  참조자
호출 시 매개변수로 넘겨주는 것 변수 내부의 값
ex) swap(m, n)
변수의 주소값
ex) swap(&m, &n)
변수 내부의 값
ex) swap(m,n)
호출 이후에 인자 넘겨준 변수 저장 값 변경 여부 변화 x 변함 변함

 

inline function (인라인 함수)

위의 함수 호출 예시 사진 같은 코드가 수십 수백 수천번 반복되게 되면 오버헤드 현상이 발생한다.

 

*오버헤드(overhead) 현상 : 컴퓨터가 유저 프로그램을 실행할 떄에 직접 유저 프로그램 처리를 하지 않는 부분.

외부 함수 사용 시 함수 사용을 위해 스택 메모리를 할당하고 함수에 따라 여러가지 연산 등이 일어나는데, 이는 예상치 못한 자원들이 사용되는 것이다. 이를 줄이기 위해 인라인 함수를 사용한다. 

 

컴파일 과정

프로그램 작성 완료 -> 컴파일 -> 링크 -> .exe 실행 

컴파일은 코드를 기계어로 번역해준다. 함수에 대한 실행은 여기선 이뤄지지 않고, 링크 과정에서 실행코드에 사용될 라이브러리를 연결시켜준다. 

함수 호출 과정은 사라지고 몸통 부분만 실행된다.

 

inline 함수는 컴파일 과정에서 처리가 진행된다. 

함수 만들 때 자료형 앞에 inline만 입력해주면 된다. 

컴파일 과정에서 inline 함수 부분이 치환되어 해당 함수로 들어가게 되는데, 실제로 사람이 작성한 코드가 왼쪽 사진에서 오른쪽 사진으로 변환되는 것이 아니라 오브젝트 파일이 생성되는 과정에서 저런 식으로 변환이 일어나는 것이다.

 

이 함수를 사용하면 실행 속도가 굉장히 빨라진다. -> 코드의 최적화

그러나 inline 함수가 많아지면 실행코드가 늘어나게 되어 불필요하게 사용 시, 컴파일 시간이 늘어나고 실행파일의 크기가 커지게 된다.

앞서 만든 코드에 함수 호출을 3번으로 늘리면, 늘린 만큼 코드 길이가 늘어나므로 실행 파일의 크기가 커진다.

 

'C++' 카테고리의 다른 글

C++ 스터디 4주차 과제 1  (0) 2022.05.16
C++ 스터디 3주차 과제 2  (0) 2022.05.07
C++ 스터디 2주차 과제  (0) 2022.04.27
C++ 스터디 1주차 과제2  (0) 2022.03.26
C++ 스터디 1주차 : 코드 작성 과제  (0) 2022.03.26