Czy jest jakiś powód, aby preferować static_cast<>
casting w stylu C? Czy są równoważne? Czy jest jakaś różnica prędkości?
c++
casting
static-cast
dicroce
źródło
źródło
Odpowiedzi:
Rzutowania w stylu C ++ są sprawdzane przez kompilator. Rzutowania w stylu C nie są i mogą zawieść w czasie wykonywania.
Ponadto rzutowania w stylu c ++ mogą być łatwo wyszukiwane, podczas gdy naprawdę trudno jest znaleźć rzutowania w stylu c.
Kolejną dużą zaletą jest to, że 4 różne odlewy w stylu C ++ wyraźniej wyrażają zamiary programisty.
Pisząc C ++, prawie zawsze używam C ++ zamiast stylu C.
źródło
dynamic_cast
s.(int)something
nie może zakończyć się niepowodzeniem - albo pojawi się błąd int lub błąd kompilatora.W skrócie :
static_cast<>()
daje możliwość sprawdzania czasu kompilacji, nie obsługuje rzutów w stylu C.static_cast<>()
jest bardziej czytelny i można go łatwo zauważyć w dowolnym miejscu kodu źródłowego C ++, rzutowanie C_Style nie jest.Więcej wyjaśnień :
Obsada statyczna wykonuje konwersje między zgodnymi typami . Jest podobny do obsady w stylu C, ale jest bardziej restrykcyjny. Na przykład rzutowanie w stylu C umożliwia wskaźnikowi całkowitemu wskazywanie znaku.
Ponieważ skutkuje to 4-bajtowym wskaźnikiem (wskaźnikiem do 4-bajtowego typu danych) wskazującym na 1 bajt przydzielonej pamięci, zapis do tego wskaźnika spowoduje błąd w czasie wykonywania lub zastąpi przyległą pamięć.
W przeciwieństwie do rzutowania w stylu C, rzutowanie statyczne pozwoli kompilatorowi sprawdzić, czy typy danych wskaźnika i pointee są kompatybilne, co pozwala programiście wychwycić to nieprawidłowe przypisanie wskaźnika podczas kompilacji.
Możesz także sprawdzić tę stronę, aby uzyskać więcej informacji na temat rzutowań w C ++: Kliknij tutaj
źródło
Zobacz Porównanie operatorów rzutujących w C ++ .
źródło
źródło
Świetny post wyjaśniający różne obsady w C / C ++ i co naprawdę robi obsada w stylu C: https://anteru.net/blog/2007/12/18/200/index.html
źródło
static_cast
sprawdza w czasie kompilacji, czy konwersja nie jest między oczywiście niekompatybilnymi typami. W przeciwieństwie do tegodynamic_cast
, sprawdzanie zgodności typów nie jest wykonywane w czasie wykonywania. Ponadtostatic_cast
konwersja niekoniecznie jest bezpieczna.static_cast
służy do konwersji ze wskaźnika na klasę podstawową na wskaźnik na klasę pochodną lub między typami rodzimymi, takimi jak enum na int lub float na int.Użytkownik
static_cast
musi upewnić się, że konwersja jest bezpieczna.Rzutowanie w stylu C nie wykonuje żadnej kontroli ani podczas kompilacji, ani w czasie wykonywania.
źródło
Ponieważ istnieje wiele różnych rodzajów rzutowania, z których każdy ma inną semantykę, static_cast <> pozwala powiedzieć „Robię legalną konwersję z jednego typu na inny”, np. Z int na double. Zwykła obsada w stylu C może oznaczać wiele rzeczy. Czy rzucasz w górę / w dół? Czy reinterpretujesz wskaźnik?
źródło