Outdated/Core Language 6

[C++ Core] 함수 개체(function object)와 람다 표현식(lambda expression)

[C++ Core] 함수 개체(function object)와 람다 표현식(lambda expression)함수 개체함수 개체(function object)란, operator()를 오버로드한 개체를 의미한다. 펑터(functor)라고도 한다. 다음은 가장 간단한 함수 개체이다.struct Foo { void operator()() { } }; // 실제 사용법 Foo a; a(); 그럼 이와 같은 함수 개체는 왜 사용하는 것일까? 바로, 성능 때문에 사용하는 것이다. 특히, 함수 개체는 STL 알고리즘을 이용할 때 유용하다. STL 알고리즘의 어떤 버전은 마지막 인자로 함수를 받는다. 가령 std::for_each()나 std::count_if() 말이다. 여기에 함수 개체를 넘겨주면 그 바디가 인라인..

[C++ Core] 상수 구문 - new 연산자

[C++ Core] 상수 구문 - new 연산자자유 영역변수들은 모두 각자만의 유효범위(scope)와 수명주기(lifetime)가 존재한다. 지역 변수인 경우에는 선언된 유효범위를 벗어나게 되면 자동으로 없어진다. 하지만, 간혹 유효범위와 독립적으로 존재하는 변수들이 유용할 때가 있다. 가령 함수 안에 있는 객체를 반환하는 경우말이다. 그런 변수들은 스택 대신 자유 영역(free store)에 존재하며 이 영역은 힙(heap), 동적 메모리(dynamic memory)라고도 불린다. 자유 영역에 존재하는 변수를 만드려면 new와 delete 연산자를 사용하면 된다.// C11 : 중괄호 초기자를 통해 초기화를 할 수 있다. int* ip = new int{ 2 }; // new[]를 이용하면 연속된 메모..

[C++ Core] 상수 구문 - const vs constexpr

[C++ Core] 상수 구문 - const vs constexpr상수 구문C++에서는 상수(constant)의 의미를 부여하기 위해 두 가지의 메커니즘을 제공한다.constexpr : 컴파일 시간에 평가한다.const : 해당 유효범위 내에서는 수정할 수 없다. 불변성을 강조한다.상수 구문은 컴파일러가 평가(evaluate)할 수 있으며, 정수, 부동소수점 수, 열거형으로 시작하여야 하며, 연산자나, 값을 결과로 생산하는 constexpr 함수로 결합할 수 있다.상수 구문은 다음의 이유 때문에 쓰인다.상수는 코드의 가독성을 높인다. 특히, 마법의 숫자(magic number)를 피할 수 있다.상수는 유지보수를 쉽게 한다.멀티 스레드 시스템에서 개체 간 자원 경쟁을 피할 수 있다.가끔 컴파일 시간에 무언..

[C++ Core] POD(plain old data), 표준 레이아웃 타입(standard layout type), 간단한 타입(trivial type)

[C++ Core] POD(plain old data), 표준 레이아웃 타입(standard layout type), 간단한 타입(trivial type)PODPOD(plain old data)란, 메모리 상에서 연속적인 바이트 열을 말한다. 이따금씩 개체를 POD로 취급해야 할 때가 있다. 가령 실행 시간 다형성이나 유저가 정의한 복사 의미론 등과 같은 진보된 의미론 문법이 필요없을 때말이다. 왜냐하면, POD로 취급하면 하드웨어에서 좀 더 효율적으로 개체를 옮기거나 복사할 수 있기 때문이다. 즉, POD는 클래스 레이아웃이나 유저가 정의한 생성, 복사, 이동 의미론의 복잡성에 대한 고려 없이 '데이터 자체'로 취급할 수 있는 개체이다.POD 개체는 다음 조건을 갖춰야 한다.표준 레이아웃 타입(stan..

[C++ Core] 우측 값 레퍼런스(rvalue reference)

[C++ Core] 우측 값 레퍼런스(rvalue reference)좌측 값과 우측 값본 설명에 들어가기 전 좌측 값(혹은 좌변 값, left-value)과 우측 값(혹은 우변 값, right-value)이 무엇인지 먼저 알 필요가 있다. 좌측 값이란 대입 연산자 왼쪽에 올 수 있는 값들을 얘기한다. 즉, 메모리가 할당되는 대상들이다. 우측 값은 좌측 값을 제외한 모든 것을 얘기한다.int i3 = 0; // i3는 좌측값, 0은 우측값이다. int i4 = i3; // i3는 여기서 우측값으로 사용된다. // 즉, i3 변수에 저장된 값이 사용되는 것이다. 우측 값 레퍼런스우측 값 레퍼런스란, 이런 우측값들을 참조할 수 있다는 얘기다. 특히, 우측 값들 중 임시 값(혹은 임시 객체)들에 대해 의미가 있..

[C++ Core] 타입 추론(type deduction) - auto와 decltype

[C++ Core] 타입 추론(type deduction) - auto와 decltype타입 추론 : auto 그리고 decltype()C++11부터 C++은 구문으로부터 타입을 추론할 수 있다. 바로 auto와 decltype()이다. 이 메커니즘이 제공됨으로써 더욱 간결하고 효율적인 코드 작성이 가능해졌다. 두 메커니즘이 추론하는 타입은 모두 컴파일러가 이미 알고있는 구문의 타입만을 보고한다.auto 타입 지정자변수를 초기화할 때, 명시적 타입을 적는 대신 auto 타입 지정자를 넣을 수 있다. auto는 그것의 초기자로부터 개체의 타입을 추론하게 되는데, 타입은 변수, const나 constexpr일 수 있다. 하지만 구문의 타입은 레퍼런스가 될 수 없다. 왜냐하면 레퍼런스는 암시적으로 구문에서 참..