2013-08-26 12 views
9

Czy jest coś, co zostanie zrobione podczas kompilacji lub uruchamiania? Szukałem go, ale otrzymałem różne odpowiedzi.Czy static_cast <T> (...) podczas kompilacji lub uruchamiania?

Ponadto, dynamic_cast<T>(...) jest oczywiście runtime - ale co z reinterpret_cast<T>(...)?

+3

"Statyczny" ... wskazówka znajduje się w nazwie. –

+0

static_cast nie wykonuje sprawdzeń w czasie wykonywania. – dare

+2

Sądząc po istniejących odpowiedziach, najważniejszym pytaniem, które należy tutaj rozstrzygnąć, jest to, co rozumiemy przez * "wykonuje się w czasie kompilacji" *. Chociaż konwersja do użycia jest wybierana podczas kompilacji, rzeczywista konwersja może (i zazwyczaj będzie) bardzo dobrze spowodować kod konwersji, który musi zostać wykonany w czasie wykonywania. –

Odpowiedz

8

Zależy od tego, co przesyłasz do czego innego. Na przykład. static_cast<std::string>("Hello") kończy połączenie z konstruktorem std::string.

Nie mogę wymyślić żadnego przypadku, w którym reinterpret_cast musiałaby generować rzeczywiste instrukcje maszyny. Mówi tylko kompilatorowi: weź ten wzór bitowy i wierz, że jest to wartość tego typu.

+0

Och, interesujące. Jakie są zasady dotyczące tego? Czy to się dzieje, gdy rzucam 'int' na' float'? A kiedy rzucam 'float' na' int'? –

+0

Obie będą prawdopodobnie wymagały wygenerowania niektórych instrukcji komputera, chyba że będziesz rzutować stałą czasu kompilacji (to znaczy, jeśli napiszesz 'static_cast (42)', kompilator będzie zazwyczaj wystarczająco inteligentny, aby po prostu zastąpić go '42f' w czasie kompilacji). –

+0

Czy byłoby to zoptymalizowane za pomocą '-O3'? Czy powinienem użyć 'reinterpret_cast', gdy jestem pewien, co robię dla intensywnych liczbowo rzutów wydajnościowych? –

4

Czas kompilacji. W rzeczywistości kompilator nawet nie wstawia kodu środowiska wykonawczego, aby sprawdzić, czy wynik jest poprawny. Kompilator sprawdza oczywiście, czy konwersja jest statycznie możliwa. Przykład: rzucanie z podklasy do nadklasy. Jeśli konwersja wymaga wywołania wbudowanej lub funkcji rzutowania, będą one oczywiście wykonywane w czasie wykonywania, ale nie będzie sprawdzania typu.

+2

Nawet rzucanie od podklasy do nadklasy może spowodować wygenerowanie kodu wykonawczego, np. kiedy wspomniana nadklasa jest w rzeczywistości wirtualną klasą bazową. –

+0

@IgorTandetnik Right. Miałem na myśli kod sprawdzania typu. Próbowałem naprawić niejednoznaczność (lub zwykły błąd! :-)). –

Powiązane problemy