개발/C++

    std::move, std::forward

    std::move와 std::forward는 C++11부터 제공되는 두 가지 유틸리티 함수로, 모두 C++ 템플릿 코드에서 유용하게 사용됩니다. std::move: std::move는 주어진 변수나 객체를 오른값 (R-value)으로 캐스팅하는 역할을 합니다. 이는 주로 객체의 소유권을 이전하거나, 복사 대신 이동(무효화된 객체를 재활용)하려는 상황에서 사용됩니다. #include #include #include class MyClass { public: MyClass() { std::cout

    람다 표현식 (lambda expression)

    람다 표현식 (lambda expression)

    C++11 부터, 람다 표현식은 함수가 호출 되거나, 함수에 arguments를 전달할 때 anonymous function objects (closures)를 정의 하기 편리한 방법입니다. 람다는 비동기 함수 또는 알고리즘에 전달되는 몇 줄 코드를 캡슐화합니다. 사용 예시 // Lambda 사용 int my_mod = 8; transform(in.begin(), in.end(), out.begin(), [my_mod](int v) -> int { return v % my_mod; }); 개시자 (introducer), 인자(parameters), 반환 타입(return type), 그리고 함수의 몸통(statement) - 개시자 [ ] 괄호 안에 외부 변수를 넣는다면, 람다 함수가 이를 캡쳐 해서, ..

    EBO (Empty Base Optimization)

    Empty Base Optimization (공백 기본 클래스 최적화) Efffective C++ 책에서 보면, EBO라는 개념이 나오는 데 이해가 안 가서 여러 자료를 통해 공부해봤다. 먼저, EBO를 코드를 통해 설명한다. 아래 코드에서 Class B의 크기는 8 또는 5이상의 크기로 나올 것이다. 왜? class A는 비어있더라도 크기가 0 이 아니다. C++은 독립 구조 객체는 반드시 크기가 0을 넘어야 한다는 제약 class A{};// 빈 클래스 class B { private: int num; A a; }; 근데, EBO란 개념은 Class B 내 Class A의 크기를 최적화시키는 방법은 제안한다. 아래 코드로 구현을 하게되면, class B의 크기는 int의 크기만 나온다. class A..

    Copy Elision, RVO

    Copy Elision (복사 생략) Cppreference 내용을 발췌하면, Omits copy and move(since C++11)constructors, resulting in zero-copy pass-by-value semantics. 해석하면, 복사 및 이동 생성자를 생략해서, 값별 복사 의미를 0으로 만듭니다. 뭐, 값에 의한 전달을 쓰면서, 복사 및 이동 생성자를 생략하는 경우를 의미하는 것 같네.... 그래서 특정 조건을 만족하면 컴파일러가 임의로 최적화를 위해 복사 및 이동 연산을 생략합니다 사실 이거를 공부하게 된 이유가 있는데, 다들 제 블로그를 보신다면 댓글로 알려주세요..제발!!!! 그 코드를 공개할게요.. 제발 아직도 이해가 안가.. #include #include struc..

    std::function 이란?

    C에서는 함수 포인터/ 콜백 함수라는 것으로 많이 배웠습니다. 이해가 잘 안가고, 매 번 볼 때마다 공부하는 것 같다.... std::function, std::bind를 배우고 나서 진짜 함수 포인터가 쉬워졌습니다. 그러나 사람은 매 번 똑같은 실수를 하지.. stackoverflow에서 사용법만 복붙해서 사용하고 있었습니다. 이런 개발자가 되어서는 안됩니다. std::function을 제대로 공부하려고, 해당 블로그를 작성합니다. 잘못된 내용이 있을 수 있으니, 꼭 다른 블로그와 교차 검증을 하셔야 합니다. std::function 이란? 클래스 템플릿 std::function 은 범용 다형 wrapper 함수입니다. std::function 의 인스턴스는 복사 생성 및 호출 대상 (함수, 람다, 바..

    JsonCpp 사용법

    먼저, JsonCPP 라이브러리 사용법을 설명하기 전에 앞서 되새겨야 하는 게 있다. `개발자는 코드를 그대로 베껴오는 게 아니라, 내 것으로 만들고 사용해야 한다` 사실 JsonCPP 사용법은 StackOverflow나 다른 블로그에 엄청 많이 올라와있다. 그래서 필자도 예제 코드를 복붙 해서 변수명만 바꿔서 쓰고 있었지.... 그래서 JsonCPP 라이브러리 사용법을 통해서 내 것으로 만들려는 노력과 연습을 하고 개발하려고 합니다. Case 3가지에 대해서 예제코드를 작성하려고 합니다. 먼저, main문 아래와 같다. #include #include #include int main(int argc, char* argv[]) { _CrtMemState memoryState = { 0 }; _CrtMem..

    map ? unorderd_map ?

    map Container는 (key, value) pair의 원소로 구성되어있다. 가장 큰 차이는 map은 레드 블랙 트리로 구현 unordered_map은 hash 방식으로 구현 즉, map에 들어가는 원소들은 key에 따라 정렬되어 저장된다. (레드 블랙 트리를 공부해야겠다.... 했지만, 이해가 안 간다.) 검색/삽입/삭제: O(logN) unordered_map은 key의 hash값에 따라서 저장된다. 검색/삽입/삭제:O(1) 이것만 보고, unordered_map 쓰면 되겠네~로 끝나면 안 된다. 어쩔 때는, map을 쓰고, 또 언제는 unordered_map을 쓰는가? 내 주관적인 답변: 개발자가 map과 unordered_map 상황에 맞게 쓰면 될 것 같다. --> 미안합니다. map 은 ..

    인라인 함수(inline function)

    인라인 함수는 프로그램의 실행 속도를 높이기 위해 추가된 기능입니다. 왜? 인라인 함수는 컴파일된 함수 코드가 프로그램의 코드 안에 직접 삽입되어진다. 어떻게 쓰나요? 인라인 함수를 사용하려면 함수 선언 앞에 inline이라는 키워드를 붙이거나 함수 정의 앞에 inline이라는 키워드를 붙인다. 특징 및 주의사항: - 클래스 멤버 함수가 inline을 사용하려면, 함수 정의의 위치가 *.h에 있어야 한다. 안 그러면 확인할 수 없는 외부 참조라고 뜬다. - 컴파일러가 inline화를 무시? 거부할 수 있다. - 반대로, 컴파일러가 자동으로 inline화를 할 수 있다. 장점: - 성능 향상 단점: - 인라인 함수를 자주 호출 한다면, 호출한 만큼 코드를 삽입하기 때문에 프로그램의 크기가 커질 수 있다.

    함수 호출 규약(Calling convention)

    참고 자료: 아래 블로그를 보는 게 더 배울 게 많다. 굳이 내 자료를 보는 것보다 설명,그림이 잘 되어있어 시간을 아끼도록 하세요! blog.kimtae.xyz/7 함수호출규약 1. 함수 호출 규약 개요 함수 호출 규약(Calling Convention)이란, 함수를 호출하는 방식에 대한 약속이다. 함수 호출 규약은 인자 전달 방법, 인자 전달 순서, Stack Frame을 정리하는 방법에 따라 그 종 blog.kimtae.xyz 함수 호출 규약이란, 함수를 호출하는 방식에 대한 약속이다. 함수 호출 규약은 인자 전달 방법, 인자 전달 순서, Stack Frame을 정리하는 방법에 따라 그 종류를 구분한다. Stack Frame은 함수의 호출 과정에서 호출되는 함수가 사용하기 위해 할당되는 Stack의..

    코딩 컨벤션 맛보기

    항상 말씀을 드리지만, 제가 기록하는 것은 제 위주로 적혀 있어 혼란을 야기할 수 있습니다. 그리고 제 자료를 머리에 저장하기 전, 여러번 구글링을 통해 정확한 자료를 머릿속에 저장하기를 부탁드립니다. 먼저, 코딩 컨벤션이란? 나 이외에 다른 사람들도 내가 작성한 코드를 보고 쉽고 빠르게 이해할 수 있도록 하나의 작성 표준 이 글에서 다룰 코딩 컨벤션은? 함수를 정의할 때, 지켜야 할 몇 가지 스텝을 말해보도록 한다. Step 1. 매개변수 이름을 더 잘 짓도록한다. - 함수의 매개변수 위치에 따라, 입력 매개변수 인지, 결과로 사용하는 매개변수인지 알 수 있도록 네이밍을 하도록한다. Step 2. 읽기전용 매개변수를 상수화 한다. - 결과가 아닌, 입력 매개변수는 읽기전용 지시어(const)를 사용한다..