본문 바로가기

개발104

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.
Modern C++ : pointer and address (98, 11) 포인터와 주소 (Pointer and Address) 개요C++에서 포인터(pointer)와 주소(address)는 메모리를 직접 제어하고 데이터를 효율적으로 관리하기 위한 핵심 개념입니다. 모든 변수는 메모리 상의 특정 위치에 저장되며, 이 위치를 나타내는 값이 바로 '주소'입니다. '포인터'는 이러한 메모리 주소를 값으로 가지는 특별한 변수입니다.이 문서를 통해 변수의 주소를 얻는 방법, 포인터를 선언하고 사용하는 방법, 그리고 포인터를 통해 원본 변수의 값을 변경하는 '역참조(dereferencing)'에 대해 알아봅니다. C++ 버전별 주요 키워드 도입 시기C++98/03: 포인터의 기본적인 개념(*, &)이 이미 존재했습니다.C++11nullptr: 0이나 NULL 대신 포인터가 아무것도 가리키.. 2025. 8. 13.
Modern C++ : const reference and value semantics (98, 11) const 참조와 값 의미론 (const Reference and Value Semantics) 개요C++에서 함수에 인자를 전달하는 방식은 프로그램의 성능과 안정성에 큰 영향을 미칩니다. 특히 const 참조를 사용하는 것은 C++ 프로그래머가 반드시 이해해야 할 중요한 개념입니다. 이 문서는 값에 의한 전달(pass-by-value)과 참조에 의한 전달(pass-by-reference), 그리고 const 참조를 사용한 전달 방식의 차이점과 장점을 설명합니다.값 의미론 (Value Semantics): 함수 호출 시 인자의 복사본을 만들어 전달합니다. 원본 데이터는 함수 내에서 변경되지 않으므로 안전하지만, 객체가 클 경우 복사 비용이 발생하여 성능 저하의 원인이 될 수 있습니다.참조 의미론 (Ref.. 2025. 8. 12.