• 카테고리

    질문 & 답변
  • 세부 분야

    게임 프로그래밍

  • 해결 여부

    미해결

Value(값)으로 리턴하는 함수의 리턴 값을 받을때에 대한 질문드립니다.

22.09.12 00:44 작성 조회수 269

0

안녕하세요, 추석 잘 보내고 계신가요?

다름이 아니라, 여쭤볼 것이 있어서,

제가 UE4 C++을 코딩하면서

여러 습관들이 있는데, 그 중 하나가

 

제가 거의 포인터가 아닌 참조를 선호하고,

Data를 Write가 아닌 Read일때 const 참조로 도배를

해버리는데, 심지어 불가피하게 포인터를 사용할 경우

예를들어,

Human* const human = 객체 주소;

이렇게 const 를 중간에 박아서, 어셈블리어를 까볼때

참조형이랑 같게 한다든지

const Human* const human = 객체 주소;

이런식으로 하면 const Human& human = 객체;

와 동의어라고 생각하여 const Human* const human;

이런식으로 사용합니다.

 

첫번째 질문 ]

함수의 매개변수 / 함수의 반환값을 받을 때

데이터가 순전히 Read용도로 사용할 경우

그냥 습관적으로 const 자료형& 을 사용합니다.

이런 습관이 맞는지에 대해서 여쭤봅니다.

 

함수 내부에 지역 변수를 리턴하는 값을 const 참조형으로 받는게 좋은지

일반적으로 Value로 받는게 좋은지에 대해서 여쭤봅니다.

 

물론 함수 지역 변수를 리턴하는 것을 그냥 참조로 받으면 해당 줄이 끝나면 리턴을 하는 함수의 CallStack 에서

해당 함수 프레임이 pop 되면서 사라지기 때문에 VC가 잡아주어 빨간줄이 나겠지만, 그냥 참조가 아닌 저는

const 참조로 받는게 습관입니다.

 

vector<Human> GetHumanVector()

{

vector<Human> HumanVector = '동적할당 해서 배열 값 세팅 전부하고'

return HumanVector; // 지역 변수 동적 배열을 리턴

}

int main()

{

const vector<Human>& HumanVec = GetHumanVector(); // 1번째 경우 : 저의 스타일

const vector<Human> HumanVec = GetHumanVector(); // 2번째 경우 : 값으로 Receive 하는 것

}

 

1번째 경우와 2번째 경우, 저는 1번째 경우를 사용하는데 2번째 경우로 저렇게 받아버리면 값 복사가 되면서

GetHumanVector(); 이 const vector<Human> HumanVec 전달 해줄때 순간적으로 메모리 사용량이 2배가 되지 않을 까 생각이 되어

무조건 참조로 받는 것이 옳다라고 생각합니다.

만약에 저 배열의 크기가 500MB라고 가정을 해봤을때

2번째 경우처럼 값으로 받을 경우 컴파일러가 해당 줄을 실행을하고 값을 전달을 할때 1GB가 메모리가 사용될 것이다.

라고 어디서 선생님이었나 책이었나 본 것 같아서

메모리 효율적 사용이라는

이러한 당위성으로 인해 저는

습관적으로 저렇게 사용하는데 혹시 제 기억이 틀린건지

적어놓은 공책이 있었는데 없어지고 검색을 해봐도

딱히 비슷한 예제가 안올라와서

R.V.O 리턴 값 최적화 정도로 함수 리턴할떄 값으로 리턴해도 된다. 이 정도 내용 밖에 없네요

1) const vector<Human>& HumanVec = : const 참조로 받는 게 좋을지

2) const vector<Human> HumanVec = : const로 받는게 좋을지 선생님의 의견은 어떠신지요

 

두번째 질문 ]

혹시 1)을 사용할때 간헐적으로 버그가

날 수 있나요?

저는 없다고 보는데 일단 참조는 컴파일 타임에 생성과 동시에 초기화가 되고, 일단 const로 받아서 빌드 돌릴때는 문제가 없는데

런타임때 버그가 날 확률이 조금이라도 있을까요???

 

답변 2

·

답변을 작성해보세요.

1

아무리 const vector&로 받아준다고는 하나,
참조하고 있는 vector가 [stack 영역에 만들어진 임시 vector]라서
언제 사라져도 이상하지 않기 때문에 저렇게 만들면 곤란합니다.

그 정도로 성능을 신경 쓰시려면
vector<Human> HumanVec; 으로 벡터를 먼저 만들고
void GetHumanVector(vector<Human>& HumanVec); 으로 함수에 벡터 자체를
참조로 넘겨서 직접 벡터에 값을 넣어주세요.

0

유영재님의 프로필

유영재

질문자

2022.09.13

넵 선생님 소중한 답변 감사합니다.

[출처]

https://vansoft1215.tistory.com/27

image이런 것 보다 차라리 선생님 께서 답변을 주신대로 습관을 들여 놓게 하는게 아무래도 좋겠습니다.

남들이 보기에도 납득이 가고, 코드 상으로 직관적으로 제가 뭘 하려고 하는게 명확하게 의도가 보이기 때문에

그리고 해당 함수 스택 메모리에 임시로 저장된 만큼 해당 함수 프레임이 call stack에서 pop 될때 까지

남을거라고 말씀 주신대로 100% 확신이 없기 때문에 선생님 말씀대로 습관을 들이겠습니다.

답변 감사합니다.!