2014-07-08 4 views
0

정적 캐스트가 컴파일 타임에 처리된다는 것을 알고 있지만 for 루프의 조건부에서 정적 캐스트는 무엇입니까? 각 반복과 함께 캐스트가 만들어 지거나 편집 중 한 번만 만들어 질 수 있습니까? 이 구현의 비용이 걱정됩니다. 나는 컴파일러가 타입을 자동으로 캐스팅 할 것이라는 것을 안다. 나는 경고를 제거하려고 시도하고있다. 예 :for 루프의 static_cast

경고 : " 'double'에서 'int'로 변환하면 값이 변경 될 수 있습니다."

+4

'경고를 제거하려고합니다'라는 경고? –

+2

무엇이 특별해야합니까?!? Tt는 방금 다른 곳에서와 같이 대했습니다. 그리고 아뇨, 깁스가 한 번 적용됩니다. –

+4

나는 당신이 컴파일러의 최적화 기능을 크게 과소 평가했다고 생각한다. –

답변

1

doubleint은 같은 것이 아니며 일반적으로 서로 다른 레지스터가 필요하며 일반적으로 변환이 자유롭지 않습니다. 컴파일러가 limit이 루프 내에서 변경되지 않는다는 것을 증명할 수 있다면 루프의 시작 부분에서 한번 변환을 줄일 수 있습니다. 컴파일러가 limit10.0과 같다고 증명할 수 있다면 정적 캐스트는 컴파일시 10으로 바뀔 수 있습니다.

+0

감사합니다. 내 예제에서 사용 된 변수는 임의적이며 실제로 작업하고있는 사용자 정의 유형을 반영하지 않습니다. – citizenkoehn

0

"..."코드에 따라 다릅니다.


이 코드의 경우 컴파일시에 limit이 알려져 있습니다.

컴파일러는 컴파일시에서 static_cast을 한 번 수행 할 수 있다고 결론을 내릴 수 있습니다. 귀하의 컴파일러 동료도 왜 작성하지 않았는지 궁금 할 수 있습니다 limitconst. 또는 시작해야 할 이유는 double입니다.

double limit = 10.0; for(int i = 0; i < static_cast<int>(limit); i++) { std::cout << i; } 
이 코드에 대한

, limit는 컴파일 타임에 알려져 있지 않다.

컴파일러는 런타임마다static_cast루프를 수행해야합니다. 귀하의 컴파일러는 왜 당신이하지 않았는지 궁금해 할 수도 있습니다 limitconst.

double limit = 10.0; 

for(int i = 0; i < static_cast<int>(limit); i++) 
{ 
    std::cin >> limit; 
} 
+0

컴파일러가 "궁금해"어떻게 될지 모르지만 실제 코드에서는 상수가 아닐 수도 있습니다. –

+0

@NeilKirk 아마도 나는 너무 의인화 된 것 같았습니다. 컴파일러가 함수를 작성하는 기능이 아니라는 점은 맞습니다. 사람들은 사물을 놀라게합니다. 피드백에 대한 –

+0

감사합니다! – citizenkoehn