벡터같은거를 반환한다고 하면 둘 중 어느방법을 쓰는게 더 좋아?
2번이 성능상 이점이 있는 것 같은데 다른사람들 쓴 코드보면 대부분 1번이더라
성능 차이가 크지 않아서 그냥 1번 하는건지 아니면 2번에 문제가 있어서 그런건지 모르겠음
함수 내용은 예시든다고 아무거나 쓴거라 상관없어
벡터같은거를 반환한다고 하면 둘 중 어느방법을 쓰는게 더 좋아?
2번이 성능상 이점이 있는 것 같은데 다른사람들 쓴 코드보면 대부분 1번이더라
성능 차이가 크지 않아서 그냥 1번 하는건지 아니면 2번에 문제가 있어서 그런건지 모르겠음
함수 내용은 예시든다고 아무거나 쓴거라 상관없어
1번은 최적화로 1 2 3 가지고 있는 벡터가 되지 않나 - dc App
FP적인 관점에서 본다면, 둘 다 마음에 안드는데? 굳이 고르라면 1번
RVO 찾아봐라
1번은 C++의 RVO(Return Value Optimization)에 의하여 니 생각보다 더 빠르게 되고, 2번은 주로 하나의 메소드에서 여러 인자를 밖으로 내보내야할 때 씀
void calculateMovement(int& outVelocity, int& outAccelation)... 뭐이런느낌
근데 1번의 경우 저렇게 선언하면, 콜 스택에서 빠져나와도 값이 살아있나? stl 쓴지 오래되서 기억이 가물가물하네. 저 코드가 힙 영역에 할당되는 코드지?
스택에 할당되고, 벡터 내부의 데이터는 일부 힙에 되겠고, RAII에 의하여 메소드 종료시점에 해제되는데, 임시객체로 반환되니까 유효하고, 여기서 다시 RVO가 나타나서 복사를 줄여줌
때에 따라 다르지
const를 초기화할때는 2번이 안되니까
그럼에도 굳이 2번을 쓴다면 임시 변수를 써야 할텐데 그러면 RVO때문에 1이 더 효율적일 거임
예전에는 최적화기술이라면서 컴파일러가 해줘도 되고 안해줘도 되는거였는데 새로운 표준에서는 무조건 하는걸로 바뀌었을거임
오...
1번 케이스는 NRVO인데 이는 표준에서 해준다고 보장하지 않고, 여기서 보장되는건 implicit move라고 컴파일러가 return std::move(ret);처럼 해줄 것이라는 것 뿐임. 표준에서 제공하는 보장된 RVO를 원하면 return { 1, 2, 3 };을 작성해서 prvalue를 리턴하게 하면 됨