static_cast< ? > 형변환 연산자?
글쓴이: nayana / 작성시간: 월, 2005/01/03 - 3:24오후
static_cast형변환연산자에서 에러가 납니다.
a.cpp: In static member function `static void Rational::expandTheFreeList()': a.cpp:112: invalid static_cast from type `char*' to type `NextOnFreeList*' a.cpp:119: invalid static_cast from type `char*' to type `NextOnFreeList*'
char* 에서 NextOnFreeList*변한이 타당하지 못하다고 나옵니다.
소스는 다음과 같습니다.
1 #include <cstdio> 2 #include <new> 3 4 #include <sys/time.h> 5 #include <unistd.h> 6 7 struct timeval Start, End; 8 9 //-------------------------------------------------------------------------------------------- 10 void t_Start( void ) 11 //-------------------------------------------------------------------------------------------- 12 { 13 gettimeofday( &Start, NULL ); 14 } 15 16 //-------------------------------------------------------------------------------------------- 17 void t_End( void ) 18 //-------------------------------------------------------------------------------------------- 19 { 20 gettimeofday( &End, NULL ); 21 } 22 23 //-------------------------------------------------------------------------------------------- 24 double tval( void ) 25 //-------------------------------------------------------------------------------------------- 26 { 27 double t1 = ( End.tv_sec - Start.tv_sec ) / 1.0; // 초 28 double t2 = ( End.tv_usec - Start.tv_usec ) / 1.0; // 마이크로 초 29 double interval = ( ( ( t1 * 1000000.0 ) + t2 ) / 1000000.0 ); 30 31 return interval; 32 } 33 34 //-------------------------------------------------------------------------------------------- 35 void Result( double t ) 36 //-------------------------------------------------------------------------------------------- 37 { 38 printf( "%.6f 초\n", t ); 39 } 40 41 //============================================================================================ 42 class NextOnFreeList 43 { 44 public : 45 NextOnFreeList* next; 46 }; 47 //============================================================================================ 48 49 //============================================================================================ 50 class Rational 51 { 52 public : 53 Rational( int a = 0, int b = 1 ) 54 :n( a ), d( b ) 55 { 56 57 } 58 59 //------------------------------------------------------------------------------ 60 inline void* operator new( size_t size ) 61 { 62 if ( 0 == freeList ) 63 { 64 expandTheFreeList(); 65 } 66 67 NextOnFreeList* head = freeList; 68 freeList = head->next; 69 70 return head; 71 } 72 //------------------------------------------------------------------------------ 73 74 //------------------------------------------------------------------------------ 75 inline void operator delete( void* doomed, size_t size ) 76 { 77 NextOnFreeList* head = static_cast< NextOnFreeList* >( doomed ); 78 //NextOnFreeList* head = ( NextOnFreeList* ) doomed; 79 head->next = freeList; 80 freeList = head; 81 } 82 //------------------------------------------------------------------------------ 83 84 //------------------------------------------------------------------------------ 85 static void newMemPool( void ) 86 { 87 expandTheFreeList(); 88 } 89 //------------------------------------------------------------------------------ 90 91 //------------------------------------------------------------------------------ 92 static void deleteMemPool( void ) 93 { 94 NextOnFreeList* nextPtr; 95 96 for ( nextPtr = freeList; nextPtr != NULL; nextPtr = freeList ) 97 { 98 freeList = freeList->next; 99 delete[] nextPtr; 100 } 101 } 102 //------------------------------------------------------------------------------ 103 104 private : 105 static NextOnFreeList* freeList; 106 107 //------------------------------------------------------------------------------ 108 static void expandTheFreeList( void ) 109 { 110 size_t size = ( sizeof( Rational ) > sizeof( NextOnFreeList* ) ) ? sizeof( Rational ) : sizeof( NextOnFreeList* ); 111 112 NextOnFreeList* runner = static_cast< NextOnFreeList* > ( new char[ size ] ); 113 // NextOnFreeList* runner = ( NextOnFreeList* ) new char[ size ]; 114 115 freeList = runner; 116 117 for ( int i = 0; i < EXPANSION_SIZE; ++i ) 118 { 119 runner->next = static_cast< NextOnFreeList* > ( new char[ size ] ); 120 //runner->next = ( NextOnFreeList* ) new char[ size ]; 121 122 runner = runner->next; 123 } 124 125 runner->next = 0; 126 } 127 //------------------------------------------------------------------------------ 128 129 enum { EXPANSION_SIZE = 32 }; 130 int n, d; 131 }; 132 //============================================================================================ 133 134 NextOnFreeList* Rational::freeList = 0; 135 136 int main ( void ) 137 { 138 Rational* array[ 1000 ]; 139 140 Rational::newMemPool(); 141 142 t_Start(); 143 144 for ( int j = 0; j < 50000; ++j ) 145 { 146 for ( int i = 0; i < 1000; ++i ) 147 { 148 array[ i ] = new Rational( i ); 149 } 150 151 for ( int i = 0; i < 1000; ++i ) 152 { 153 delete array[ i ]; 154 } 155 } 156 157 t_End(); 158 Result( tval() ); 159 160 Rational::deleteMemPool(); 161 162 return 0; 163 }
stic_cast 연산자 대신 c에서 해던 방식으로 강제로 형변환을 시키면 문제가 없습니다. 하지만 static_cast 연산자는 허용하지가 않습니다. 하지만 위의 소스를 보시는거와 같이 void 형태는
캐스팅이 잘됩니다.
( static_cast< NextOnFreeList*>doomed ); 나머지 2개는 캐스팅이 안됩니다.
Forums:
이상한 코드군요. Rational과 NextOnFreeList* 를 같은
이상한 코드군요. Rational과 NextOnFreeList* 를 같은 메모리 영역에 저장하려는 게 목표인가요? 그렇다면 그냥 union을 쓰지 않는 이유라도??
[quote]Rational과 NextOnFreeList* 를 같은 메모
같은 메모리 영역에 할려는것은 맞습니다.
union은 무슨 말씀이신지요?
reinterprete_cast
님이 하고자하는 바는 reinterprete_cast가 하고자 하는바입니다.
reinterprete_cast를 사용하세요.
reinterprete_cast 연산자는 일단 비표준형 형변환으로 알고
reinterprete_cast 연산자는 일단 비표준형 형변환으로 알고 있습니다. reinterprete_cast 형변환연산자를 쓰지 않는 이유는 충분히 static_cast 연산자로 reinterprete_cast 형변환 연산자를 대치해서 쓸수있고
reinterprete_cast 형변환 연산자를 사용할 경우 비 표준 형변환이다보니 심각한 실행 오류를 범할수가 있고 다른 플랫폼에서는 프로그램이 다르게 작동되는 문제를 초래할수가 있기 때문입니다.
[quote="nayana"]reinterprete_cast 연산자는 일
static_cast는 형변환이 허용되어 있는 형 사이에서만 사용 가능합니다. 부모와 자식 클래스 사이의 캐스팅이나 int에서 long, float에서 int 등이 그것입니다. reinterpret_cast<>가 C 형식의 캐스트와 동일한 동작을 하며 이러한 캐스트가 지양되는 것은 구현 의존적이기 때문이지 뭐 심각한 문제가 있는 것은 아닙니다. :]
----------------------------
May the F/OSS be with you..
[quote="nayana"]reinterprete_cast 형변환
char * 형에서 NextOnFreeList* 형으로의 변환이 이에 해당합니다. :cry:
[quote="nayana"]reinterprete_cast 형변환연산자
잘못 알고 계십니다. static_cast<T'>(T)는 T --> T' 또는 T' --> T 의 변환이 허용될
때만 쓸 수 있는 것이며 reinterpret_cast를 대치할 수 있는 것은 아닙니다.
reinterpret_cast는 전혀 관련이 없는 형변환을 할 때(지금처럼 char* -->
NextOnFreeList*) 쓰는 것이며, 따라서 reinterpret_cast를 쓴 코드는 이식성이
없을 가능성이 높습니다.
그렇군요...제가 잘못알고 있었습니다.^^;
그렇군요...제가 잘못알고 있었습니다.^^;
댓글 달기