andromedarabbit / earlgrey

High performance online gaming server engine.
2 stars 1 forks source link

numeric_cast 의 요구사항 #14

Closed GoogleCodeExporter closed 9 years ago

GoogleCodeExporter commented 9 years ago
최근에 기완씨가 numeric_cast를 수정했는데요. 코드 리뷰를 
요청할까 하다가 이건 버그
가 아니라 요구사항에 대한 합의 문제라는 생각이 들어서 
Discussion request를 끊습니
다. 

이번에 r239 에서 기완씨가 추가한 기능은 예를 들어 int -> 
unsigned int 등을 지원하는 겁
니다. 저는 일부러 이러한 캐스팅을 뺐는데요. 그래서 
예전엔 UINT new = (int)1 이란 코드
가 있으면 컴파일 오류가 났습니다. numeric_cast는 안전한 
경우에만 쓰고 그렇지 않은 명
우엔 static_cast로 강제 변환을 하는 편이 낫다고 봤습니다. 

기완씨가 변경한 부분도 이해는 되는 것이 예를 들어 x86일 
때와 x64일 때 실제 타입이 다
른 사용자 정의 타입인 경우가 있기 때문입니다. 예를 
들어....

#ifdef WIN32
typedef int MYTYPE;
#else
typedef UINT MYTYPE;
#endif

MYTYPE old = 1;
UINT new = numeric_cast<UINT>( old );

이런 코드일 때죠.
x64일 때 이 코드는 컴파일 오류가 납니다. 

저는 그냥 이런 경우에 static_cast를 쓰길 바랐습니다만......

설명이 길었는데 어느 쪽으로 가야 할지 정해야겠네요.

Original issue reported on code.google.com by kaistizen on 22 Sep 2009 at 3:46

GoogleCodeExporter commented 9 years ago
제가 추가한 이유는 약간 다른데요, size_t -> DWORD(unsigned long) 
으로 변환하는 것 때문
입니다.
x64에서는 uint64 -> uint32 변환 이라서 문제가 되지 않지만 
x86에서는 uint32 -> uint32 인
데, 타입자체가 달라서 (typedef로 다르게 정의한 것과는 
다른) 기존 코드가 동작하지 않았습
니다. 이런 경우에는 static_cast로 해결이 안되니까 
numeric_cast를 사용할 수 밖에 없거든
요. 그러다 보니 재훈씨가 의도하지 않았던 게 
발생한거네요... 거기까진 생각 못했네요

Original comment by gwkan...@gmail.com on 22 Sep 2009 at 4:15

GoogleCodeExporter commented 9 years ago
흠.. x86 에선 static_cast를 x64 에선 numeric_cast 를 사용해도 되긴 
하겠네요.. 

Original comment by gwkan...@gmail.com on 22 Sep 2009 at 4:17

GoogleCodeExporter commented 9 years ago
근데,, 다시 보니 두번째 삽질이었던것 같은 ㅡㅡ;;;

Original comment by gwkan...@gmail.com on 22 Sep 2009 at 4:28

GoogleCodeExporter commented 9 years ago
http://code.google.com/p/earlgrey/source/detail?r=245
업뎃했습니다.

Original comment by gwkan...@gmail.com on 22 Sep 2009 at 4:39

GoogleCodeExporter commented 9 years ago
재훈씨가 예로 보여준 코드에 대한 문제는 결정을 해야 할 
것 같아서 issue 다시 열었습니다.

Original comment by gwkan...@gmail.com on 22 Sep 2009 at 4:41

GoogleCodeExporter commented 9 years ago
boost쪽을 봐도 numeric_cast는 static_cast를 쓰면 안전하지 않은 
캐스팅을 감지하지 못하기 때문에 
만든 거네요. 그러니까 제 처음 의도가 맞나 보네요. 음... 
원래 boost의 numeric_cast를 이식하려다 실
패해서 이런 형태가 된 거니까 당연한 걸지도 ^^

문제가 되는 경우를 boost에서 어떻게 처리하는지 한번 
살펴봐야겠네요.

Original comment by kaistizen on 22 Sep 2009 at 4:50

GoogleCodeExporter commented 9 years ago
지금보니 r239 에서 제가 수정한 코드도 unsigned int를 int로 
변환 못하는 건 마찬가지네요.
그 코드가 sign 값도 같고 size도 같을 경우에만 static_cast하는 
거거든요..

Original comment by gwkan...@gmail.com on 23 Sep 2009 at 2:33

GoogleCodeExporter commented 9 years ago
[deleted comment]
GoogleCodeExporter commented 9 years ago
부호가 같고 size 가 같다는 건.... 이 코드가 현재 정수만 
다루기 때문에 약간 문제가 있을지 모르는데
요. 실수형과 정수형을 상호 변환할 때 어떤 문제가 있지 
않을까요?

Original comment by kaistizen on 23 Sep 2009 at 2:04

GoogleCodeExporter commented 9 years ago
그렇겠네요.. 지금은 코드 수정했으니 그 문제는 
없을거예요.

Original comment by gwkan...@gmail.com on 23 Sep 2009 at 6:40

GoogleCodeExporter commented 9 years ago
순전히 boost의 numeric_cast 에 의존하기로 합니다.

EARLGREY_NUMERIC_CAST 매크로를 이용하는데, boost 가 없을 땐 
static_cast 로 대체합니다.

Original comment by plaint...@andromedarabbit.net on 7 Oct 2011 at 7:59