2010-02-03 3 views
12

나는 double을 int로 변환하기 위해 장면 뒤에서 어떤 일이 발생하는지 궁금하다. int (5666.1)? 부모 클래스에 대한 자식 클래스의 static_cast보다 비용이 더 많이 듭니까? int와 double의 표현은 근본적으로 다르므로 프로세스 중에 생성 된 임시 객체가있을 것이고 값 비싼 것도있을 것입니다.장면 뒤의 int에서 double 변환?

답변

18

네이티브 부동 소수점이있는 모든 CPU에는 부동 소수점을 정수 데이터로 변환하는 명령이 있습니다. 그 작업은 몇 사이클에서 많은 시간이 걸릴 수 있습니다. 일반적으로 FP와 정수에 대해 별도의 CPU 레지스터가 있으므로 정수를 정수 레지스터로 이동해야만 사용할 수 있습니다. 아마도 다른 작업 일 수도 있고 비용이 많이들 수도 있습니다. 프로세서 설명서를 참조하십시오.

PowerPC는 특히 FP 레지스터의 정수를 정수 레지스터로 이동하라는 지시를 포함하지 않습니다. FP에서 메모리로의로드와 정수로의로드가 있어야합니다. 따라서 임시 변수가 만들어 졌다고 말할 수 있습니다.

하드웨어 FP 지원이없는 경우 번호를 해독해야합니다. IEEE FP 형식은 다음과 같습니다

sign | exponent + bias | mantissa 

// Single-precision format values: 
int const mantissa_bits = 23; // 52 for double. 
int const exponent_bits = 8; // 11 for double. 
int const exponent_bias = 127; // 1023 for double. 

std::int32_t ieee; 
std::memcpy(& ieee, & float_value, sizeof (std::int32_t)); 
std::int32_t mantissa = ieee & (1 << mantissa_bits)-1 | 1 << mantissa_bits; 
int exponent = (ieee >> mantissa_bits & (1 << exponent_bits)-1) 
      - (exponent_bias + mantissa_bits); 
if (exponent <= -32) { 
    mantissa = 0; 
} else if (exponent < 0) { 
    mantissa >>= - exponent; 
} else if (exponent + mantissa_bits + 1 >= 32) { 
    overflow(); 
} else { 
    mantissa <<= exponent; 
} 
if (ieee < 0) mantissa = - mantissa; 
return mantissa; 

즉, 몇 비트 풀고 지침과 변화처럼 뭔가를해야, 변환합니다.

4

코드 생성기가 인텔 SSE2 명령어 세트를 사용하는 경우에는 항상 작업을 완료하는 전용 FPU 명령어가 있습니다. cvttsd2si 그것은 빠르지 만 정적 인 캐스트만큼 빠르지는 않습니다. 보통 코드를 필요로하지 않습니다.

4

static_cast는 컴파일러의 C++ 코드 생성에 따라 다르지만 일반적으로 포인터 변경은 캐스트의 가정 된 정보를 기반으로 컴파일 타임에 계산되므로 런타임 비용이 없습니다.

double을 int로 변환하면 x86 시스템에서 컴파일러가 FIST (부동 소수점/정수 변환) 명령어를 생성하고 FPU가 변환을 수행합니다. 이 변환은 소프트웨어로 구현 될 수 있으며 특정 하드웨어에서이 방법으로 수행되거나 프로그램에서 필요합니다. GNU MPFR 라이브러리는 int에서 double 변환을 수행 할 수 있으며 모든 하드웨어에서 동일한 변환을 수행합니다.

+1

현대의 x86의 경우 컴파일러에서 x87이 아닌 SSE2 명령어를 생성 할 수 있습니다. – MSalters

+0

@MSalters : 의존; 일부 "현대"컴파일러는 여전히 기본적으로 x87 FPU에 codegen을 가지고 있지만, 많은 컴파일러가'cvttsd2si '를 방출합니다. –

+0

예, x86-32에서는'cvttsd2si'가 있다고 가정 할 수 없습니다. 하지만 x86-64 용으로 비추천 x87 ins을 사용하는 컴파일러가 있습니까? – MSalters