Function Overloading : 함수의 이름이 같고 그 파라미터가 다를 때 name mangling을 통해서 컴파일러가 서로 다른 함수를 만들어 주는 것. 이 코드를 compiler explorer를 통해 어셈블리 코드를 확인해 보면 function(3), function(2.7) 은 각각에 맞는 함수를 콜 해주고 있고 이름이 바뀌어 있다. (_Z8functioni: ...) (_Z8functiond: ...) 이런 식으로 name mangling 된 것. 이렇기에 function overloading은 static polymorphism이라고도 불리는데, 그 이유는 어떤 함수가 바인딩 될 지 컴파일 시간에 결정이 되기 때문이다. 이와 비교되는 개념으로는 dynamic polymorphism이 ..
전체 글
C#, 유니티 게임 개발자다음과 같은 코드를 짰을 때, 컴파일러가 알아서 만들어주는 메소드들이 있다. 1. Constructor 2. Destructor 3. copy/move Constructor 4. copy/move Assignment : 일반적으로 Constructor는 직접 만들어주고 destructor을 포함한 나머지 5가지 메소드들은 직접 만들어주지 않는다. but 이렇게 포인터를 활용해서 리소스를 관리하게 되면 개발자가 직접 이 5가지의 메소드를 관리해 주어야 한다. 구글에서 c++ rule of three / rule of five 로 검색하게 되면 cppreference에서 관련 내용을 확인 가능하다. https://en.cppreference.com/w/cpp/language/rule_of_three The ..
멤버 생성 리스트에 대해서 알아보면, 크게 Class의 컨스트럭터와 디스트럭터가 있다. 1. Constructor : Object가 생성될 때 불러지는 함수. 클래스 이름과 같은 함수를 만들면 완성됨. 2. Destructor : Object가 없어질 때 불러지는 함수 클래스 이름 앞에 ~가 붙은 함수를 만들면 완성됨. ex) Compiler Explorer로 어셈블리 코드를 확인해 보면, 메인 함수 안에서 다른 함수를 부르는 call 명령어를 확인해 보면, 처음에 고양이 컨스트럭터 Cat::Cat(), 다음으로 Cat::speak(), 마지막으로 고양이 디스트럭터 Cat::~Cat() 가 순서대로 불려지는 걸 확인할 수 있다. 즉 컨스트럭터와 디스트럭터는 클래스 안에서 마법처럼 동작하는 것이 아니라, ..
class에서 사용되는 static은 앞선 챕터에서 다루었던 빌드의 링크 프로세스에서 사용되는 static과는 다른 의미이다. static의 사용 예시는 다음과 같은 3가지 경우로 나누어 볼 수 있다. 1. static member function (static 멤버 함수) 2. static member variable (static 멤버 변수) 3. static variable in a function. (함수 안의 static 변수) 1. static member function 1) static member function은 object와 연관되어 있지 않다! 이 코드에서처럼 멤버 함수는 굳이 object를 만들지 않아도 콜 할 수 있다. 멤버 함수가 굳이 객체를 만들지 않아도 콜 할 수 있는 이유..
C++의 OOP란, 객체Object 가 중심이 되서 프로그래밍하는 패러다임. C++ 는 여러가지 패러다임을 제공해 주는 멀티 패러다임 언어이다. 1) procedural 2) functional 3) OOP - ( Object-Oriented Programming ) 4) generic 를 모두 지원해 준다. 그 중에서도 OOP가 중심이 되는 언어가 C++이다. 또 다른 OOP 중심 언어는, java, C#, python 이 있다. C++의 OOP는 class를 중심으로 구현하게 되므로, 먼저 object와 class가 어떻게 다른지 이해해야 한다. 1. class와 object의 차이 class: definition. -Cat object: 메모리에 공간을 차지하고 있는 객체 하나하나를 지칭. -kit..
RVO 가 일어나게 되면, 앞서 배웠던 소유권의 이전(move)이 발생할 필요 없이 0 copy 를 달성해 낼 수 있다. 함수의 return 값을 value로 하게 되면(return by value) RVO가 개입되며 가장 효율적인 할당을 해낼 수 있다는 것이다. 다음의 코드를 보면, 프로세스는 이렇게 진행될 것이라 생각하기 쉽다. 심지어 이럴 때 std:move() 를 사용해서 copy를 없애주고자 하는 사람도 있다. 하지만, 실제로는 RVO가 개입된다. : 실제로 컴파일러는 Return Value Address가 a를 가리키고 있다는 것을 알고 있다. 따라서 결국 함수공간 안에 힙 공간에 문자열을 만들고 a가 직접 이 공간을 가리키도록 만들어 놓는다. 함수가 끝나고 해제되며 우측 그림처럼 된다. RV..
예제 1 이를 그림과 함께 설명해보면, 1) 스택에 a가, 힙에 "Headless" 가 존재한다. 2) 스택에 string object b 가 올라가면서 move()를 통해서 b가 "Headless"를 가리키게 된다. (a의 소유권이 이전됨) 3) b를 출력하게 되면 "Healess"가 출력되고, 이후 a를 출력하게 되면 a는 아무 것도 가리키지 않기 때문에 출력값이 비어있게 된다. 즉, move() 키워드는 Lvalue를 Rvalue로 바꾸면서 resource ownership 을 다른 object에게 넘겨줄 수 있다는 것이다. 이 예제에서는 a가 가지고 있던 힙 공간에 "Headless"의 ownership을 move() 명령어를 통해서 b에 넘겨준 것이다. 예제 2 함수를 콜 했을 때 레퍼런스를 넘..
1. L-value, R-value란? 다시 한 번 부를 수 있으면 Lvalue 한 번만 쓰이고 다시 불릴 수 없으면 Rvalue std::string S = "abc"; 같은 경우에도 S값은 나중에 다시 부를 수 있기 때문에 Lvalue, "abc"는 이 명령어에서만 쓰이고 다시는 쓰이지 않기 때문에 Rvalue. 더 자세한 설명은 다른 분들이 잘 정리해 주셨으니 참고할 것. https://effort4137.tistory.com/entry/Lvalue-Rvalue Lvalue Rvalue C++ Lvalue와 Rvalue에 대한 오해 Lvalue와 Rvalue는 보통 Left-value(왼쪽값)과 Right-value(오른쪽값)로 풀어서 씁니다. 이 때문에 대입 연산자(=)를 기준으로 왼쪽에 위치하는..