본문 바로가기

분류 전체보기65

Effective C++ (31) ~ (35) 31) 파일 사이의 의존성을 최대로 줄이자 #include는 헤더 파일들 사이에 컴파일 의존성을 만든다. 보통은 전방 선언으로 이러한 문제를 해결한다. 이 때 표준 라이브러리들은 전방 선언을 하지 않는다. precompiled header를 쓰는 환경이라면 더더욱 그럴 필요가 없다. 전방 선언시 pimpl 관용구를 통해 인터페이스와 구현을 분리하면, 구현을 수정했을 때 해당 클래스를 사용하는 다른 부분은 컴파일을 다시 할 필요가 없게 된다. 아래 foo 클래스와 같이 pimpl 관용구를 사용하는 클래스를 핸들 클래스라고 한다. class fooImpl; class foo{ private: std::shared_ptr pImpl; } 컴파일 의존성을 최소화하는 전략은 다음과 같다. 객체 참조자나 포인터로 .. 2021. 8. 24.
Effective C++ (26) ~ (30) 5. 구현 26) 변수 정의는 최대한 늦추자 객체를 선언해 기본 생성한 후 대입하는 방법은 비효율적이다. 기본 생성자를 건너뛸 수 있다면 건너 뛰고 초기화 인자를 얻을 때까지 정의를 미루자. 루프에 대해서는 다음 두가지 선택지가 있다. // A 방법 Widget w; for(int i = 0; i < n; ++i) { w = Widget(i); // i에 따라 달라지는 값 } // B 방법 for(int i = 0; i < n; ++i) { Widget w(i); // i에 따라 달라지는 값 } A 방법은 생성자 1번 + 소멸자 1번 + 대입 n번 B 방법은 생성자 n번 + 소멸자 n번이 불린다. 만약 대입 비용이 생성자+소멸자 쌍보다 적게 드는 경우엔 A가 효율이 좋다. 하지만 그렇지 않을 때엔 B가 .. 2021. 8. 22.
내가 존경하는 어떤 박사님에 대해서 세상에는 풀 수 없는 어려운 문제가 있다. 적어도 내가 그 박사님을 만나기 전에는 그렇게 생각했었다. 그 분과는 내가 20대 초반에 다녔던 학원에서 스승과 제자의 관계로 만났다. 신기하게도 내가 관심있는 컴퓨터 그래픽스 분야의 교수님을 맡고 계셨었다. 학원에 입학하기 전 그 분야에 대해 쓰신 짧은 글을 읽었다. 이제 그 글이 무슨 내용이었는지는 잘 기억나지 않는다. '몽키 코더'가 되지 않으려면 잘 공부하라는 내용이었던 것 같다. 그런데 왜인지 나는 첫눈에 꽂혀 그때부터 교수님을 존경하게 되었다. 어떤 분일까 설레는 마음으로 학원에 갔던 첫날부터 교수님을 찾았는데, 소년처럼 해맑게 웃으시면서도 약간은 시니컬한 말투가 피터팬을 연상케 하는 분이었다. 나는 자연스레 교수님을 따르게 되었다. 하루는 하던 과제.. 2021. 8. 17.
Effective C++ (21) ~ (25) 4. 설계 및 선언 21) 함수에서 객체를 반환해야 할 경우에 참조자를 반환하려고 하지 말자 지역 객체에 대한 참조자를 반환해서는 절대로 안된다. 함수 내에서 생성된 지역 객체는 함수가 종료되자 마자 사라지기 때문이다. 그렇다면 객체를 힙에 생성해서 반환하는 것은 어떨까? 그러면 delete의 책임이 모호해진다. 최후의 방법으로 정적 객체의 참조자를 반환하는 것은 어떨까? 그러면 스레드 안정성 문제가 생기며 반환 식이 의도와 다르게 동작하는 경우가 왕왕 생긴다. 반환 값이 복사되는 것에 대해 너무 안타깝게 생각하지 말자. C++에서는 컴파일러가 일부 조건 하에 최적화 메커니즘을 통해 빠르게 동작할 수 있도록 만들어 줄 것이다. 22) 데이터 멤버가 선언될 곳은 private 영역임을 명심하자 public.. 2021. 8. 16.
Effective C++ (16) ~ (20) 3. 자원 관리 13) new와 delete를 사용할 땐 반드시 형태를 맞추자 delete에 []가 붙었는지 아닌지로 배열 요소를 삭제해야하는지 아닌지 결정되기 때문에 new를 썼다면 delete를, new[]를 썼다면 꼭 delete[]를 써주도록 하자. 또 헤깔릴 일이 없도록 배열 타입은 typedef로 정의할 때 주의하자. 14) new로 생성한 객체를 스마트 포인터에 저장하는 코드는 별도의 한 문장으로 만들자 다음과 같은 코드는 컴파일되지 않는다. void processWidget(std::shared_ptr pw, int priority); // 호출 processWidget(new Widget, getPriority()); shared_ptr의 생성자는 explicit 키워드로 선언되어 있기 .. 2021. 8. 14.
햄버거를 사러갔는데 날이 덥고 습하다보니 입맛이 없다. 엎친데 덮친격으로 얼마전에 위염도 심하게 와서 뭘 먹어도 맛이없고 역했다. 워낙 퉁퉁했던지라 티는 안나지만 덕분에 3키로나 빠졌다. 근데 갑자기 와퍼가 먹고싶어서 모자를 쓰고 집근처 버거킹으로 향했다. 가는 길에 코인으로 햄버거값 3천원을 벌었다. 여러 거래소에서 거래되는 코인은 손으로 거래하지 않는다. 봇들의 배를 불려주는 일이라는 것을 알고있기 때문이다. 콧노래가 절로나와 가벼운 발걸음으로 키오스크 앞에 도착했다. 신나게 다리를 떨면서 3900원짜리 와퍼 세가지 중 하나를 고르고 있는데 갑자기 누가 키오스크 맞은편으로 오더니 불쾌한 눈으로 빤히 쳐다보기 시작했다. 굳이 날 쳐다본다고 생각하고 싶지도 않았기 때문에 무시하고 할라피뇨 와퍼를 골랐다. 콰트로 치즈 와퍼와.. 2021. 8. 12.
반응형