뭥미

    람다 표현식 (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) - 개시자 [ ] 괄호 안에 외부 변수를 넣는다면, 람다 함수가 이를 캡쳐 해서, ..

    항목 8: 0과 NULL보다 nullptr를 선호하라

    리터럴 0은 int이지 포인터가 아니다. NULL도 포인터 형식이 아니라는 점. void f(int);//f의 3 가지 오버로딩 void f(bool); void f(void*); f(0);//f(int) 호출 f(NULL)//보통 f(int) 호출 nullptr의 장점은 정수 형식이 아니다. 사실 포인터 형식도 아니다? 이 책보면서, 아쉬운건 번역이나 뭔가 어순?이 안 맞음. 내 맞춤법 마냥 답 없음 nullptr의 실제 형식은 std::nullptr_t인데, std::nullptr_t 자체는 다시 "nullptr의 형식"으로 정의(순환 정의) f(nullptr);//f(void*) 오버로딩 호출 nullptr 은 코드의 명확성 높여준다. auto result = findRecord(...); if(r..

    OpenGL 공부 시작!

    OpenGL 을 공부하기 시작합니다. 현재 개발하는 특성상 OpenGL이 기본인데, 하나도 모른다. 그래서 공부시작합니다. https://www.youtube.com/c/FlyHeavensky Dr. Bean의 코딩교실 부경대학교 컴퓨터공학과의 장원두 교수입니다. 코딩, 프로그래밍에 대한 강좌를 올리고 있습니다.^^ www.youtube.com 부경대학교 장원두 교수님이 유튜브로 공개하신게 있어서 유튜브로 보고 진행하려고합니다. 추천하시는 책 / 블로그 있으면 언제든지 추천주세요!

    항목 51: new 및 delete를 작성할 때 따라야 할 기존의 관례를 잘 알아 두자

    기존의 관례에 잘 맞는 operator new를 구현하려면 다음의 요구사항만큼은 기본으로 지켜야 합니다. - 반환 값이 제대로 되어 있어야 합니다. - 가용 메모리가 부족할 경우에는 new 처리자 함수를 호출(항목 49) - 크기가 없는 (0byte) 메모리 요청에 대한 대비책 - 기본 형태의 new가 가려지지 않도록 해야합니다. void* operator new(std::size_t size) throw(std::bad_alloc) { using namespace std; if(size == 0) { size = 1; } while (true) { //size 바이트를 할당 if(/*할당 성공*/) { return (/*할당된 메모리에 대한 포인터*/); } //할당 실패 시, 현재 new 처리자 함수..

    항목 49: new 처리자의 동작 원리를 제대로 이해하자

    operatore new 함수는 예외를 던지게 되어 잇습니다. 메모리 할당이 제대로 되지 못한 상황에 대한 반응으로 operator new가 예외를 던지기 전에, 이 함수는 사용자 쪽에서 지정할 수 있는 에러 처리 함수를 우선적으로 호출하도록 되어 있는데, 이 에러 처리 함수를 가리켜 new 처리자라고 합니다. set_new_handler는 new_handler를 받고 new_handler를 반환하는 함수입니다. 즉, set_new_handler가 받아들이는 new_handler 타입의 매개변수는 요구된 메모리를 operator new가 할당하지 못했을 때 operator new가 호출할 함수의 포인터입니다. new 처리자 함수가 다음 동작 중 하나를 꼭 해주어야함. - 사용할 수 있는 메모리를 더 많이..

    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. 리팩토링의 장점..