Pierwotnie jest to część innego pytania.
Dlaczego sizeof
nazywany jest operatorem czasu kompilacji? Czy to właściwie nie jest operator czasu wykonywania? A jeśli rzeczywiście jest to operator czasu kompilacji, w jaki sposób pomaga w tworzeniu przenośnego kodu, który działa tak samo na różnych komputerach? Proszę wyjaśnić szczegółowo.
sizeof(polymorphic_ptr*)
bycie stałym jest sprzeczne z intuicją i po prostu głupie. Tak, to sposób w C ++, ale głupiutki.Odpowiedzi:
sizeof()
daje rozmiar typu danych , a nie rozmiar konkretnej instancji tego typu w pamięci.Na przykład, jeśli miałeś obiekt danych ciągu, który przydzielił tablicę znaków o zmiennej wielkości w czasie wykonywania,
sizeof()
nie można użyć do określenia rozmiaru tej tablicy znaków. Dałoby to tylko rozmiar wskaźnika.Rozmiar typu danych jest zawsze znany w czasie kompilacji.
źródło
sizeof
na tablicy, to będzie uzyskać rozmiaru tablicy (czyli razy rozmiar elementu liczba elementów). Ale jeśli użyjesz go na wskaźniku, otrzymasz tylko rozmiar wskaźnika. Tak więc, ponieważ w większości przypadków, gdy chcesz poznać rozmiar tablicy, masz tylko wskaźnik, nie jest to aż tak przydatne.ponieważ cały rozmiar „wywołania” jest obliczany w czasie kompilacji, a cokolwiek między nawiasami jest odrzucane i nie jest uruchamiane w czasie wykonywania,
wynik opiera się wyłącznie na informacjach o typie statycznym dostępnych dla kompilatora
źródło
Ponieważ w czasie kompilacji kompilator oblicza wielkość wyrażenia i zastępuje stałą wartość czasu kompilacji.
Nie. Możesz nawet użyć
sizeof
do oceny rozmiaru wyrażeń, których nie możesz legalnie wykonać (tj. Spowodowałoby to Niezdefiniowane Zachowanie), o ile kompilator może dowiedzieć się, jaki jest typ wyrażenia.Ponadto, nawet przed C ++ 11
constexpr
, możesz używaćsizeof
wyrażeń w sposób, w jaki nie możesz używać wyrażeń wykonawczych.Typy mogą różnić się rozmiarem na różnych platformach. Używanie
sizeof
wyrażeń zamiast zakodowanych na stałe założeń oznacza, że Twój kod nie ulegnie awarii, gdy kompilujesz na innej platformie, a typy zmieniają rozmiar.źródło
C ++ tak naprawdę nie przechowuje metadanych dla obiektów w czasie wykonywania, więc sprawdzanie rozmiaru musi być czasem kompilacji. Na przykład, jak C ++ nie sprawdza poprawności rozmiaru, zadeklaruj tablicę o
int
dowolnym rozmiarze i odczytaj poza jej końcem. Jeśli masz szczęście, dostaniesz,segfault
ale bardziej prawdopodobne, że po prostu przeczytasz bełkot, ponieważ C ++ nie śledzi rozmiaru twojej tablicy.Zobacz: Czy program C / C ++ może uszkodzić program przed odczytem poza końcem tablicy (UNIX)? na przykład z SO.
źródło