{ union 이 무엇인지 안다면, 어떨때 에러가 나는지 알 수 있을 것이다. union 은 사실 같은 데이터형의 확장을 하나의 형에 몰아 넣어 호환성을 극대화 할 때 사용하면 매우 좋다. .. 물론 이렇게 말만 하니 무슨 말인지 모를 것이다. 다음 예제를 보자. #include #include // 소켓 주소 담는 곳 union addr_system { sockaddr base; sockaddr_in v4; sockaddr_in6 v6; SOCKADDR_STORAGE storage; }; int main( void ) { addr_system addr_; } 이렇게 정의 하면 bind 나 기타 다른 sockaddr 이 필요한 곳에 &addr_.base; 로만 넘겨 줘도 된다. 또한 경우가 바뀌여서 v6..
책 정리/C++ Coding Standards : C++ 코딩의 정석 검색 결과
{ 뭐 다들 알겠지만 C++ 에선 클래스의 내부 값이 스마트 포인터, 각종 핸들, 카운팅 객체, 상속성 객체 등이 즐비하므로, memcpy 했다가 정체를 알수 없는 행동을 한다거나 memcpy 했다가 같은 것임에도 다르다고 비교 될 수 있는 경우가 반드시 생긴다. KGCA15기 임훈 형이 만든, 메모리 풀(물론 공부 목적으로 만든 것이다)에서 문제점이 없는지 찾아 봐달라고 요청이 왔을 때, 문제점의 냄새는 맡았으나, 어떤 냄새인지 정의를 내리지 못하였다. 그런데 이 책을 보다가 아! 이거구나! 했었다. 그런데 사실 memcpy 나 memcmp 를 사용한 적이 별로 없더라 ... }
{ 정말 여러가지 이유가 있지만 대표적으로 꼽자면, 가독성이 떨어진다는 점과, reinterpret_cast 보다 더 강력한 cast 이기 때문이다. 그 강력함 중 하나를 설명한다. 포인터는 그 정의가 보이지 않더라도 전방선언으로 마치 보인것 처럼 컴파일러를 속여 컴파일 하게 할 수 있다. 이러한 상태에서 형 변환을 하게 되면, 정의가 보이지 않는데도 형 변환이 가능하게 된다. 이때 해당 정의가 보이지 않기 때문에 메모리 레이아웃을 맞추지 못하고 결국 어떤 일을 할지 모르는 포인터가 만들어 지게 된다. 그런데 VC 2008 에선 .. 잘 된다.. 해당 소스 코드를 첨부 하오니, 한번 테스트 해 보심이 좋을 것 같다. Func.cpp 의 7 라인에 break point 를 걸어서, dp의 멤버 변수가 있고..
{ 알다시피 메모리에는 상수성 메모리가 존재한다. 또한 개념상 상수성이여야 하는 경우도 있다. 이러한 이유로 const 로 설정된 것을 굳이 비상수성으로 만들어 사용할 이유가 없다.(물론 어쩔수 없을 때가 있긴 하다) 그러므로 상수성을 건들여서 버그가 생기거나, 예측할 수 없는 일이 일어나 하루 종일 디버깅을 하기 싫다면, 상수성만은 건들지 않는게 좋다. 대표적인 예를 한번 들어 보자. #include const char* str = "hello, world"; int main( void ) { std::cout
{ static_cast 와 dynamic_cast 는 키워드에서 부터가 정적과 동적 캐스팅이라는 느낌이 온다. static_cast 는 문법상 형변한이 가능하다면(C++의 문법) 그냥 형을 변환시킨다. dynamic_cast 는 문법상 형변환이 가능하더라도, 실제로 형 변환이 가능한가를 런타임에 검사를 한다. 이런 차이가 있기 때문에, static_cast 가 더 빠른 장점이 있지만, 위험한 단점이 있다. 책에서의 한 구절을 옮기면 "전기세 아끼려고 불끄고 공부하다가 눈 나빠진다"라는 말(물론 내가 좀 바꾸었지만)이 있다. 그리고 dynamic_cast 를 써야 한다면, 기반 클래스의 인터페이스가 무척 부족한 것이므로, 한번쯤 디자인에 대해서도 고려를 해봐야 될 듯 싶다. 아참 dynamic_cast ..
{ 필요할 때도 있긴 하지만, 극히 드물기 때문에, 역시 자제하는게 옳다고 생각 한다. 책의 내용 중 "거짓말은 다리가 짧다(독일속담)" 이라는 구절이 있다. reinterpret_cast 는 바로 거짓말과 같다.(그래서 때론 필요할 떄가 있는것 이다. ㅋ) 이 거짓말은 컴파일러의 눈과 귀를 막고, 프로그래머의 횡포를 보고있는 것과 같은 것이다. 대표적으로 reinterpret_cast 는 비트 패턴을 바꾸어 버리거나 재해석하기도 하는데, 책에는 없지만, 이런 예제를 만들어 봤다. #include class ikpil { public: ikpil() : a(0) { } void draw() { std::cout
최근댓글