전체 글

전체 글

    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..

    항목 7: 객체 생성 시 괄호(())와 중괄호({})를 구분하라

    C++11에서는 객체 생성 구문이 아주 다양해졌다. C++ 에서는 Class 개념이 있기 때문에 초기화와 배정이 각자 다른 함수들을 호출한다. 정확하게 괄호/중괄호를 이해하고 써야하는 이유이다. 중괄화 초기화를 선호한다. 절대 여기만 보고 페이지 넘기지마세요~ 초반에만 중괄호 초기화에 대한 내용을 기술하고, 후반부터는 단점을 기술한다. 장점 1: narrowing conversion을 방지 double x, y, z; int sum1{ x + y + z};//오류! double들의 합을 int로 표현하지 못할 수 있음 괄호나 "="를 이용한 초기화는 이러한 좁히기 변환을 점검하지 않는다. 장점 2: 가장 성가신 구문 해석에 자유롭다는 점 가장 성가신 구문 해석은 "선언으로 해석할 수 있는 것은 항상 선언..

    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..

    항목 6: auto가 원치 않은 형식으로 연역될 때에는 명시적 형식의 초기치를 사용하라

    항목 5에서 설명했듯이, auto를 사용해서 변수를 선언하면 형식을 명시적으로 지정했을 때보다 기술적으로 여러 가지 장점이 있다. 그러나 가끔은 auto의 형식 연역이 딴전을 부리기도 한다. Widget w; ... bool highPriority = features(w)[5];//w의 우선순위가 높은가? ... processWidget(w, highPriority);//w를 그 우선순위에 맞게 처리한다 해당 코드는 잘 작동하지만, 아래 코드는 예측할 수 없다. auto highPriority = features(w)[5];// w의 우선순위가 높은가? processWidget(w, highPriority);//미정의 행동 auto를 사용하는 버전에서 highPriority의 형식은 더 이상 bool이 ..

    항목 5: 명시적 형식 선언보다는 auto를 선호하라

    먼저, Effective Modern C++을 책을 읽기 시작했습니다. 항목 1~4는 어딨을까요? 필자는 템플릿을 문법만 알지.. 잘 쓰지 못한다.. 그래서 잠깐 스킵 auto 의 장점 1. 변수의 초기화를 빼먹는 실수를 방지한다. int x1;//문맥에 따라서는 초기화되지 않을 수 있음 auto x2;//Error auto x3 = 0; //Ok 2. 반드시 형식을 지정해줘야 하는 경우보다 편리성과 효율성에서 장점을 가진다. std::function 객체를 통해서 클로저를 호출하는 것은 거의 항상 auto로 선언된 객체를 통해 호출하는 것보다 느리다. 메모리와 시간을 더 많이 소비한다. 와우....처음 알았음.. 3.32 bit -> 64bit 이식할 때 문제 방지를 할 수 있다. 4. 리팩토링의 장점..