Programing

static_cast <>와 C 스타일 캐스팅의 차이점은 무엇입니까?

crosscheck 2020. 5. 16. 11:12
반응형

static_cast <>와 C 스타일 캐스팅의 차이점은 무엇입니까?


static_cast<>C 스타일 캐스팅보다 선호 할만한 이유가 있습니까? 그것들은 동등합니까? 속도 차이가 있습니까?


C ++ 스타일 캐스트는 컴파일러에서 확인합니다. C 스타일 캐스트는 런타임에 실패하고 실패 할 수 있음

또한 c ++ 스타일 캐스트는 쉽게 검색 할 수 있지만 c 스타일 캐스트는 검색하기가 어렵습니다.

또 다른 큰 장점은 4 가지 C ++ 스타일 캐스트가 프로그래머의 의도를보다 명확하게 표현한다는 것입니다.

C ++을 작성할 때 C 스타일보다 항상 C ++을 사용합니다.


한마디로 :

  1. static_cast<>() 컴파일 시간 검사 기능을 제공하지만 C 스타일 캐스트는 그렇지 않습니다.
  2. static_cast<>() 더 읽기 쉽고 C ++ 소스 코드의 어느 곳에서나 쉽게 찾을 수 있습니다. C_Style 캐스트는 없습니다.
  3. C ++ 캐스트를 사용하면 의도가 훨씬 더 잘 전달됩니다.

더 많은 설명 :

정적 캐스트는 호환 가능한 유형 간에 변환을 수행합니다 . C 스타일 캐스트와 비슷하지만 더 제한적입니다. 예를 들어 C 스타일 캐스트는 정수 포인터가 문자를 가리 키도록 허용합니다.

char c = 10;       // 1 byte
int *p = (int*)&c; // 4 bytes

이로 인해 1 바이트의 할당 된 메모리를 가리키는 4 바이트 포인터 (4 바이트 데이터 유형에 대한 포인터)가 발생하므로이 포인터에 쓰면 런타임 오류가 발생하거나 일부 인접한 메모리를 덮어 씁니다.

*p = 5; // run-time error: stack corruption

C 스타일 캐스트와 달리 정적 캐스트는 컴파일러가 포인터 및 포인트 데이터 유형이 호환되는지 확인하여 프로그래머가 컴파일 중에이 잘못된 포인터 할당을 잡을 수있게합니다.

int *q = static_cast<int*>(&c); // compile-time error

C ++ 캐스트에 대한 자세한 설명은이 페이지를 참조 하십시오. 여기를 클릭하십시오.


C ++ 캐스팅 연산자 비교를 참조하십시오 .

그러나 다양한 다른 캐스팅 작업에 동일한 구문을 사용하면 프로그래머의 의도가 불분명해질 수 있습니다.

또한 큰 코드베이스에서 특정 유형의 캐스트를 찾기가 어려울 수 있습니다.

C 스타일 캐스트의 일반성은 필요한 모든 것이 간단한 변환 인 상황에서 과도 할 수 있습니다. 전력이 다른 여러 주조 작업자를 선택할 수 있으므로 프로그래머가 실수로 잘못된 유형으로 캐스팅하는 것을 방지 할 수 있습니다.


struct A {};
struct B : A {};
struct C {}; 

int main()
{
    A* a = new A;    

    int i = 10;

    a = (A*) (&i); // NO ERROR! FAIL!

    //a = static_cast<A*>(&i); ERROR! SMART!

    A* b = new B;

    B* b2 = static_cast<B*>(b); // NO ERROR! SMART!

    C* c = (C*)(b); // NO ERROR! FAIL!

    //C* c = static_cast<C*>(b); ERROR! SMART!
}

static_cast컴파일 타임에 변환이 분명히 호환되지 않는 유형 사이에 있지 않은지 확인합니다. 반대로 dynamic_cast런타임에 형식 호환성 검사가 수행되지 않습니다. 또한 static_cast변환이 반드시 안전한 것은 아닙니다.

static_cast 포인터에서 기본 클래스로, 파생 클래스로의 포인터로, 또는 enum에서 int로 또는 float에서 int와 같은 기본 유형간에 변환하는 데 사용됩니다.

의 사용자 static_cast는 변환이 안전한지 확인해야합니다.

C 스타일 캐스트는 컴파일 또는 런타임시 점검을 수행하지 않습니다.


C / C ++의 다양한 캐스트와 C 스타일 캐스트가 실제로하는 일을 설명하는 훌륭한 게시물 : https://anteru.net/blog/2007/12/18/200/index.html

(유형) 변수 구문을 사용하는 C 스타일 캐스팅 최악의 발명품. 다음 순서로 캐스트를 시도합니다 (C ++ 표준, 5.4 expr.cast 단락 5 참조).

  1. const_cast
  2. static_cast
  3. static_cast 다음에 const_cast
  4. reinterpret_cast
  5. reinterpret_cast 다음에 const_cast

Since there are many different kinds of casting each with different semantics, static_cast<> allows you to say "I'm doing a legal conversion from one type to another" like from int to double. A plain C-style cast can mean a lot of things. Are you up/down casting? Are you reinterpreting a pointer?

참고URL : https://stackoverflow.com/questions/1609163/what-is-the-difference-between-static-cast-and-c-style-casting

반응형