개요 이 글에서는 C++에서의 값에 의한 전달과 참조에 의한 전달을 알아본다. 전에 포인터 관련 글을 작성하면서 배경지식 또한 미리 설명을 했기 때문에, 특정 상황에서 값에 의한 전달과 참조에 의한 전달의 장단점을 알아보겠다. [C/C++] 포인터를 사용하는 이유 포인터를 사용하는 이유 포인터가 왜 필요할까? 포인터를 왜 쓸까? 포인터를 왜 사용할까? 에 대해서 생각해보기 전에... 포인터에 대해서 잘 모른다면 아래 '포인터란 무엇인가'부터 읽어보자. upbo.tistory.com 값에 의한 전달 vs 참조에 의한 전달 값으로 전달되면 객체의 새로운 사본이 생성되어 함수에 전달된다. 이 전달 방식은 굉장히 큰 객체를 전달하는 경우 사본을 생성하는 데 비용이 많이 든다. (낭비된다.) 그래서 복사 생성자를..
C++
문제 lvalue에 사용할 수 있는 참조 연산자 &를 rvalue에 사용하고 있어서 발생한 문제이다. 내 경우엔 DirectX 예제 코드를 vs2022로 컴파일하던 중 C2102 에러가 발생했다. 원인이 되는 코드는 어떤 변수에 구조체를 할당하지 않고, 바로 함수의 매개변수로 그 구조체의 주소를 넘겨주고 있었다. 말로 하니 어려운데 아래 코드와 비슷하다. struct MyStruct { int i; }; MyStruct bar () { MyStruct result = { 5 }; return result; } /* won't compile; 'lvalue required as unary & operand */ void qux () { int *j = &bar().i; } 해결 rvalue에 &연산을 하지..
Lvalue와 Rvalue C++에서 lvalue는 특정 메모리 위치를 가리킨다. 반면 rvalue는 아무데도 가리키지 않는다. 일반적으로 rvalue는 일시적이고 수명이 짧지만 lvalue는 변수로 존재하기 때문에 수명이 더 길다. int x = 666; // ok 여기서 666은 rvalue이다. 숫자(엄밀히 말하자면 리터럴 상수)는 프로그램 실행 중의 임시 레지스터를 제외하면 특정 메모리 주소가 없다. 666은 변수 x에 할당된다. 변수는 특정 메모리 주소가 있으며 따라서 lvalue이다. C++에서 할당 연산자(assignment operation)인 =는 왼쪽 피연산자(left operand)로 lvalue가 필요하다. 그리고 lvalue인 x를 가지고 다음과 같은 것을 할 수 있다. int *..
포인터를 사용하는 이유 포인터가 왜 필요할까? 포인터를 왜 쓸까? 포인터를 왜 사용할까? 에 대해서 생각해보기 전에... 포인터에 대해서 잘 모른다면 아래 '포인터란 무엇인가'부터 읽어보자. 이미 배경지식이 있다면 상관없다. 화씨를 섭씨로 바꾸는 프로그램을 작성한다고 가정해보자. #include // 화씨 온도를 입력받아 섭씨단위로 바꿔준다. void ToCelsius(double F) { F = (F - 32)/1.8; } // 물론 이렇게 반환한 값을 호출부에서 활용해도 된다. // 하지만 본 글에서는 위의 구현에 대해서 다룬다. double ToCelsius2(double F) { return (F-32)/1.8; } int main() { double temperature = 32; // 화씨 3..