programing

유형 캐스팅에 추가 CPU 주기가 소모됩니까?

telecom 2023. 10. 22. 19:25
반응형

유형 캐스팅에 추가 CPU 주기가 소모됩니까?

C/C++에서 Type Casting을 하면 CPU 사이클이 추가됩니까?

적어도 특정한 경우에는 CPU 사이클을 추가로 소비해야 한다고 생각합니다.CPU가 플로트 구조를 정수로 변환해야 하는 플로트에서 정수로의 유형 캐스팅과 유사합니다.

float a=2.0;
int b= (float)a;

CPU 사이클이 추가로 소모되는 경우를 이해하고 싶습니다.

출연자가 있는지 없는지가 아니라 '유형 간의 대화'가 우리가 봐야 할 부분이라고 말씀드리고 싶습니다.예를들면

 int a = 10;
 float b = a; 

다음과 같을 것입니다.

 int a = 10;
 float b = (float)a;

이는 유형의 크기를 변경하는 경우에도 적용됩니다.

 char c = 'a';
 int b = c; 

이 유언장"c의 상태가 된int데이터 이동 자체 위와 그 너머에 추가 명령(또는 사용된 명령에 추가 클럭 사이클)을 추가할 가능성이 있는 단일 바이트(8비트가 아닌 C 의미의 바이트 사용)로부터의 크기.

때때로 이러한 변환은 전혀 분명하지 않습니다.x86-64의 대표적인 예는 다음과 같습니다.int대신에unsigned int배열의 인덱스에 대해 계산할 수 있습니다.포인터가 64비트이므로 인덱스를 64비트로 변환해야 합니다.서명되지 않은 경우에는 사소한 일입니다. 32비트 로드 작업을 수행하면 레지스터의 맨 위 부분이 0으로 채워지기 때문에 값이 이미 있는 64비트 버전의 레지스터만 사용하면 됩니다.하지만 만약 당신이.int, 부정적일 수도 있습니다.그래서 컴파일러는 "sign extend this to 64bit" 명령어를 사용해야 합니다.이것은 일반적으로 고정된 루프를 기반으로 인덱스가 계산되고 모든 값이 양수인 경우에는 문제가 되지 않지만, 매개 변수가 양수인지 음수인지 명확하지 않은 함수를 호출하면 컴파일러는 값을 확장해야 합니다.함수가 인덱스로 사용되는 값을 반환하는 경우에도 마찬가지입니다.

하지만, 합리적으로 유능한 컴파일러라면 어떤 것을 자신의 타입에서 자신으로 변환하기 위한 명령어를 무심코 추가하지는 않을 것입니다. (최적화가 해제되어 있다면 그럴 수도 있겠지만, 최소한의 최적화는 "우리는 X 타입에서 X 타입으로 변환하고 있는데, 그것은 아무 의미가 없습니다. 그것을 없애버리자."라는 것을 알아야 합니다.

따라서 간단히 말해서 위의 예는 추가적인 벌칙을 추가하지는 않지만 "한 유형에서 다른 유형으로 데이터를 변환하는 것은 코드에 추가적인 명령어 및/또는 시계 주기를 추가하는" 경우도 분명히 있습니다.

기본적인 표현이 바뀌는 주기를 소비하게 됩니다.따라서 변환을 하면 사이클이 소모됩니다.float완전히int또는 versa의 반대쪽입니다.다음과 같은 아키텍처 캐스팅에 따라 다름int.char아니면long long.int주기를 소비할 수도 있고 그렇지 않을 수도 있습니다.포인터 유형 간의 캐스팅은 여러 개의 상속이 포함된 경우에만 주기를 소비합니다.

다양한 종류의 캐스트가 있습니다.C++에는 다양한 유형의 캐스트에 대해 다양한 유형의 캐스트 연산자가 있습니다.그런 면에서 보면...

static_cast한 유형에서 다른 유형으로 변환하는 경우 일반적으로 비용이 발생합니다. 특히 대상 유형이 원본 유형과 다른 크기인 경우에는 더욱 그렇습니다.static_casts는 파생된 유형에서 기본 유형으로 포인터를 캐스트하는 데 사용되기도 합니다.특히 파생 클래스에 여러 개의 베이스가 있는 경우에는 비용이 발생할 수도 있습니다.

reinterpret_cast일반적으로 직접적인 비용은 들지 않습니다.느슨하게 말하면, 이런 유형의 캐스팅은 값을 바꾸는 것이 아니라 해석 방식을 바꿀 뿐입니다.그러나 이 경우 간접 비용이 발생할 수 있습니다.바이트 배열에 대한 포인터를 int에 대한 포인터로 재해석할 경우 플랫폼이 기대하는 대로 포인터가 정렬되지 않는 한 포인터를 다시 참조할 때마다 비용을 지불할 수 있습니다.

const_cast대부분 컴파일러에 대한 주석이기 때문에 일관성을 추가하거나 제거할 경우 비용이 전혀 들지 않습니다.휘발성 한정자를 추가하거나 제거하는 데 사용하는 경우 특정 최적화를 사용하거나 사용하지 않도록 설정하기 때문에 성능 차이가 있을 수 있습니다.

dynamic_cast, 기본 클래스의 포인터에서 파생 클래스의 포인터로 캐스트하는 데 사용되는 이 방법은 최소한 변환이 적절한지 확인해야 하기 때문에 비용이 가장 확실합니다.

기존의 C 캐스트를 사용할 때는 기본적으로 컴파일러에게 보다 구체적인 캐스트 유형을 선택하도록 요구하는 것입니다.그래서 당신의 C 캐스트에 비용이 있는지를 파악하기 위해서는 실제로 어떤 종류의 캐스트인지를 파악해야 합니다.

DL과 Agner Fog의 설명서 감상:

1. C++에서 소프트웨어 최적화: Windows, LinuxMac 플랫폼의 최적화 가이드
거대한 PDF이지만 우선 다음을 확인할 수 있습니다.

14.7 플로트와 더블을 섞지 말 것
14.8 부동 소수점 숫자와 정수 간의 변환

언급URL : https://stackoverflow.com/questions/16539412/does-typecasting-consume-extra-cpu-cycles

반응형