참조

CJB_ny·2022년 8월 3일
0

C++ 정리

목록 보기
34/95
post-thumbnail

참조

이런식으로 코드가 작성되어있다고 보자.

그리고 스택 프레임을 보면은

[매개변수][RET][지역변수]

이 삼총사가 반복이 되는데

그리고 함수를 호출 할 경우에는

이렇게 info의 주소를 넘겨주면된다.

그리고 main함수의 스택 프레임을 보자면은

[매개변수][RET][지역변수 (info ]

지역변수에 info라는 구조체가 만들어진 형태이다.

이상태로 CreateMonster를 호출을 하면

[매개변수][RET][지역변수 (info) ][매개변수 (&info) ][RET][지역변수 ]

이런식으로 들어가게된다.

버젼차이를 명확히 인지 ❗

밑에 CreateMonster는 값복사 방식이다.

이거 두개는 완전히 다른 방식이다.

밑에 버젼은 info를 복사받아서 자기자신만의 스택프레임내에서 값을 수정하고

함수가 종료가 되면 해당 스택 프레임 날아감.

즉, 인자로 넘겨준 원본 info는 값이 안바뀐다.

매개변수의 값만 출력하고싶은 경우

이렇게 두가지 버젼의 함수로 구현을 해줄 수 있다.

1 값전달 버젼은 info를 통째로 다 복사를 한다음에 출력

2 주소 버젼은 주조값만 전달받아서 출력

당연히 2버젼의 경우가 효율적이다.

기억해야할게 구조체가 1000바이트라면

값전달은 1000바이트 복사 비용 발생

주소 전달은 64비트 기준 8바이트만 전달을 하는 셈이다.

포인터 변수의 크기만큼만 (안에 데이터로 주소값을 들고있으니)

참조 전달 방식 ❗❗❗

로우레벨 (어셈블리) 관점에서 실제 동작 방식은

"포인터"와 똑같다.

int& ref = number;

C++관점에서는 number 라는 바구니에 또 다른 이름을 부여한 것.

number라는 바구니에 ref 라는 이름을 지어준 것이다.

앞으로 ref 바구니에다가 뭘 꺼내거나 넣으면,

실제 number 바구니(진퉁)에다가 그 값을 꺼내거나 넣으면된다.

또다른 이름을 짓는 이유?

사용할 때에는

주소값을 명시적으로 꺼내서 넘겨줄 필요없이

info자체만 넘겨주면은 내부적으로 알아서 주소값 꺼내와서 사용한다.

로우레벨 과점에서 보면은 포인터와 동작방식이 같아서

주소를 전달해준다고 보면은 된다.

profile
https://cjbworld.tistory.com/ <- 이사중

0개의 댓글