본문 바로가기

CPP23

Modern C++ : std::vector, emplace_back vs push_back (98, 11, 17) C++ vector의 emplace_back vs push_back 개요std::vector에서 emplace_back과 push_back은 모두 컨테이너의 끝에 요소를 추가하는 멤버 함수입니다. 이 두 함수는 비슷해 보이지만 내부 동작 방식에서 중요한 차이점이 있습니다. emplace_back은 C++11에서 도입된 기능으로, 불필요한 복사나 이동 연산을 피하고 직접 객체를 생성할 수 있게 해줍니다. C++ 버전별 주요 키워드 도입 시기C++98/03: push_back()만 사용 가능C++11: emplace_back() 도입, 완벽한 전달(perfect forwarding) 지원C++17: emplace_back()이 참조를 반환하도록 변경 내용 설명push_back의 동작 방식전달된 인자로 임시 .. 2025. 8. 22.
Modern C++ : std::vector (98, 11, 14, 17, 20) C++ std::vector 컨테이너 개요std::vector는 C++ 표준 라이브러리에서 제공하는 동적 배열 컨테이너로, 연속된 메모리 공간에 요소를 저장합니다. 자동으로 메모리를 관리하고 크기를 동적으로 조정할 수 있어 가장 널리 사용되는 컨테이너 중 하나입니다. 임의 접근이 가능하고, 끝에서의 삽입/삭제가 효율적입니다. C++ 버전별 주요 키워드 도입 시기C++98/03: 기본 std::vector 기능 도입C++11: 이동 생성자/대입 연산자, emplace_back(), shrink_to_fit()C++14: 일반화된 람다 캡처와 함께 사용 개선C++17: 구조적 바인딩과 함께 사용 개선, emplace_back()이 참조 반환C++20: std::span과의 호환성, std::ranges 지원.. 2025. 8. 21.
Modern C++ : template, std::span (20) C++ 템플릿과 std::span을 활용한 컨테이너 순회 개요C++ 템플릿은 다양한 데이터 타입에 대해 동작하는 일반화된 코드를 작성할 수 있게 해주는 강력한 기능입니다. std::span은 C++20에서 도입된 뷰(view) 타입으로, 연속된 메모리 영역을 안전하고 편리하게 다룰 수 있게 해줍니다. 이 두 기능을 조합하면 다양한 컨테이너 타입을 일관된 방식으로 처리할 수 있는 유연한 코드를 작성할 수 있습니다. C++ 버전별 주요 키워드 도입 시기C++98/03: 기본 템플릿 지원 시작C++11: auto, 범위 기반 for 루프, std::array 도입C++14: 일반화된 람다 캡처, 변수 템플릿C++17: 클래스 템플릿 인수 추론(CTAD), std::string_viewC++20: std::sp.. 2025. 8. 20.
Modern C++ : perfect forwarding (11) C++ 완벽한 전달(Perfect Forwarding)출처https://jongwook.tistory.com/743 완벽한 전달: 문제이동 시맨틱과는 별개로 r-value 레퍼런스는 완벽한 전달(perfect forwarding) 문제를 해결하기 위해서 만들어졌습니다. 아래와 같은 간단한 팩토리 함수를 생각해 봅시다.templateshared_ptr factory(Arg arg){ return shared_ptr(new T(arg));}보시다시피 이 예제의 의도는 팩토리 함수의 인수로 주어진 arg를 T의 생성자로 전달하는 것입니다. arg의 입장에서 보면 마치 팩토리 함수가 존재하지 않았고 생성자를 상위에서 직접 호출한 것처럼 행동하는 것이 이상적이겠죠. 이것이 완벽한 전달입니다. 이 코드는 그것에 .. 2025. 8. 19.
Modern C++ : rvalue reference summary (11) C++ RValue Reference Summary 1. 기존 C++의 레퍼런스#include class MyClass{};int main(void){ MyClass a; MyClass& b = a; // b가 a를 참조하도록 한다.} 2. R-Value Reference의 등장C++11에서 R-Value Reference(&&)가 추가되어 R-Value 참조가 가능해졌습니다.#include class MyClass{};int main(void){ MyClass a; MyClass&& c = a; // R-Value Reference 사용} 3. L-Value와 R-Value의 기본 개념#include int main(void){ int d = 13; .. 2025. 8. 18.
Modern C++ : lvalue, rvalue, value category (98, 11) Lvalue, Rvalue, and C++ Value Category 1. 개요C++11의 핵심 기능인 Rvalue 참조(Rvalue references)와 이동 의미론(Move Semantics)을 이해하려면 Lvalue와 Rvalue의 개념을 명확히 알아야 합니다. 이 문서는 전통적인 Lvalue/Rvalue 개념부터 C++11 이후 확장된 값 카테고리(value categories)까지, 기존의 유용한 예제들을 바탕으로 종합적으로 설명합니다. 2. Lvalue와 Rvalue의 기본 개념가장 간단한 구분 기준은 "표현식의 주소를 안전하게 얻을 수 있는가?" 입니다.Lvalue (Locator Value): 식별 가능한(identifiable) 메모리 위치를 가지는 표현식입니다. 이름이 붙어 있거나, .. 2025. 8. 17.
Modern C++ : rvalue reference (98, 11) rvalue reference의 이해원본 글http://cpplover.blogspot.jp/2009/11/rvalue-reference_23.html lvalue, rvalueC에서의 lvalue, rvalue의 차이는 대입 연산자의 오른쪽에 있는지 왼쪽에 있는지의 차이 뿐이었다. 즉 left hand value, right hand value.하지만 C++에서의 lvalue, rvalue는 그와는 완전히 다른 개념이다.lvalue는 명시적으로 실체가 있는 명명된 객체.rvalue는 일시적으로 생성된 무명의 객체. C++에서의 rvalue, lvalue의 예struct S {};int func() { return 0;};int main(){ int i=0; i; // lvalue .. 2025. 8. 16.
Modern C++ : lvalue rvalue reference (98, 11) LValue and RValue References (98, 03, 11) 개요C++에서 모든 표현식(expression)은 "LValue" 또는 "RValue"라는 두 가지 기본 속성 중 하나를 가집니다. 이 둘을 구분하는 것은 함수 오버로딩, 이동 의미론(move semantics), 완벽한 전달(perfect forwarding)과 같은 C++의 고급 기능을 이해하고 효율적인 코드를 작성하는 데 매우 중요합니다.LValue (Locator Value): 메모리 상의 위치를 가지며, 이름으로 참조할 수 있는 객체입니다. 등호(=)의 왼쪽에 올 수 있습니다. (예: 변수)RValue (Right Value): 임시적인 값으로, 메모리 상의 특정 위치를 가지고 있지 않습니다. 등호(=)의 오른쪽에만 올 .. 2025. 8. 15.
Modern C++ : dynamic heap memory allocation (98, 11, 14) 동적 힙 메모리 할당 (Dynamic Heap Memory Allocation) 개요C++에서 메모리는 크게 스택(Stack)과 힙(Heap) 두 영역으로 나뉩니다. 동적 메모리 할당은 프로그램 실행 중에(런타임) 필요한 만큼의 메모리를 힙 영역에서 할당받아 사용하는 방식입니다. 컴파일 시점에 크기를 알 수 없거나, 객체의 생명주기를 특정 범위(scope)를 넘어서까지 제어하고 싶을 때 유용합니다.반면, 함수 내에 선언된 일반 변수들은 스택에 저장되며, 해당 함수가 종료되면 자동으로 메모리에서 해제됩니다. 동적으로 할당된 힙 메모리는 프로그래머가 delete 키워드를 사용하여 명시적으로 해제하기 전까지 계속 유지되므로, 메모리 관리에 각별한 주의가 필요합니다. C++ 버전별 주요 키워드 도입 시기C++9.. 2025. 8. 14.