본문 바로가기

C,C++/C++51

[C++] 복사 생성자 및 할당(=) 연산자가 호출되는 시점 | 초기화와 할당의 차이 | RVO(Return Value Optimization) 먼저 초기화(Initializeinitialization)와 할당(Assignment)의 차이부터 살펴보자. 초기화는 객체의 생성과 동시에 초기 값을 설정해주는 것을 말한다. 흔히들 변수 선언만 해놓고 다른 곳에서 값을 할당하는 것을 초기화라고 하는 사람도 있는데, 엄밀히 말하면 이것은 초기화가 아니라 할당이다. 그 이유는, 일단 객체 선언 시 값을 대입을 하지 않으면 객체의 타입에 맞게 알아서 기본 초기화가 된다. 객체가 int, double과 같은 기본 타입(non-class)일 경우는 초기에 값을 할당하지 않을 경우 기본 초기화가 되며, c++에선 기본 타입에 기본 초기화 시 정의되지 않은 쓰레기 값을 갖는다. 반면 string과 같은 class 타입의 객체는 타입에 알맞게 기본 생성자를 호출하여 .. 2020. 2. 7.
[C++] 캐스팅 연산자에 대해 알아보자 | static_cast, reinterpret_cast static_cast와 reinterpret_cast는 C 타입의 캐스팅이 용도에 따라 분리되어 C++에 등장한 캐스팅 방법이다. 예를 들어 C에서는 다음과 같이 캐스팅을 하였고 웬만하면 모든 캐스팅이 가능했다. unsigned int num = 20; int signedNum = (int)num; 하지만 이는 사용자의 의도와 상관없이 대부분의 캐스팅을 허용해주기 때문에 사용자의 실수를 허용하는 일이 많았다. 그래서 C++에서 용도에 따라 사용하도록 4가지 캐스팅으로 나누어서 도입하였고 여기선 제일 자주 사용되는 2가지만 정리한다. 그 2가지는 static_cast와 reinterpret_cast이며 특징은 다음과 같다. - 사용 방법 static_cast(변환할 대상) reinterpret_cast(변.. 2020. 1. 23.
[C++] 클래스의 멤버가 저장되는 영역 및 메모리 차지 클래스 사용 도중 헷갈리던 내용이 있어서 정리함. 함수 내에서 임시로 객체를 생성할 때 사용 용도에 따라 비효율적인 부분이 있는지 헷갈려서 instance 생성 시 각 멤버들이 어떻게 메모리를 차지하는지 개념을 정리하기 위한 글. 우선 class는 멤버 변수와 멤버 함수를 가질 수 있고 각각 정적(static)과 비정적(non-static) 멤버 변수, 함수를 가질 수 있다. 먼저 클래스 타입의 객체 또는 인스턴스 자체의 크기는 비정적 멤버 변수만 영향을 미친다. 즉 멤버 변수로 int형 변수 1개를 가지면 이 클래스의 instance의 sizeof는 4바이트, 2개를 가지면 8바이트 이런 식. 비정적 멤버 변수는 객체의 생성과 동시에 생성된다. 객체 내의 지역 변수와 동일하므로 스택에 저장된다. (물론.. 2020. 1. 10.
[C++] 조정자(Manipulator)를 알아보자 C++은 출력 형식을 사용자가 원하는대로 지정할 수 있는 Manipulator를 제공한다. c++의 outstream인 std::cout과 2020. 1. 3.
[C++] 가비지 컬렉션과 참조 카운트에 대해 알아보자 | 메모리 관리 자동화 프로그래밍 언어엔 메모리를 프로그래머가 직접 관리해주는 unmanaged 언어와 언어단에서 관리해주는 managed 언어가 있다. 대표적인 예로 C/C++가 unmanaged 언어이며 C#, Java가 managed 언어이다. 대부분의 매니지드 언어에선 자동으로 메모리 관리를 하기 위해 다음 중 하나의 기법을 사용한다. (해당 포스팅에선 스마트 포인터를 다루기 위한 사전 지식을 위해 간단한 개념만 정리합니다.) Garbage collection (가비지 컬렉션 또는 쓰레기 수집) Reference counting (레퍼런스 카운팅 또는 참조 횟수) [Garbage collection] 가비지 컬렉션을 한국말로 굳이 번역하면 쓰레기 수집인데, 사용되지 않는 메모리를 언어단에서 수집하여 지운다는 의미로 보면.. 2019. 12. 30.
[C++] C 스타일 enum과 C++ 11의 Enum class에 차이에 대해 알아보자 기존의 C 스타일 enum과 달리 C++ 11에서 등장한 enum class는 확실한 타입이 생겼다. 기존 enum은 타입이 정해져있지 않고 컴파일러가 암시적으로 정수로 변환해주는 형식이였다. 또한 다음과 같이 2개의 다른 enum 타입이 있을 때, 서로 비교가 가능했다. 이는 실제론 단순히 숫자이기 때문에 비교가 되지만 의미상으론 서로 다른 enum 타입을 비교한다는 것이 옳지 않았다. enum eColor { Red, // 0 Green, // 1 Blue, // 2 Count // 3 }; enum eAnimal { Tiger, // 0 Lion, // 1 Hipo, // 2 Count2 // 3 // Count // 다른 enum 멤버의 이름과 중복될 수 없음 }; void main() { eCo.. 2019. 12. 18.