2013-02-22 18 views
12

stworzyłem klasy X o tylko 2 funkcje publiczne (konstruktora i spalające) oraz przy użyciu sizeof operatora wielkość klasy zbliża się 1.W jaki sposób operator size2 C++ oblicza rozmiar?

Kiedy dodać Prywatny członek danych typu char powyższej deklaracji klasy , rozmiar jest nadal 1. Wreszcie dodaję do niego typ całkowity jako element danych klasy, a teraz rozmiar to 8 bajtów.

Wyjaśnij mi, w jaki sposób obliczana jest wielkość klasy.

+0

proszę pisać odpowiedni kod. –

Odpowiedz

23

Po pierwsze, zdaj sobie sprawę, że funkcje, które nie są wirtualne, nie mają wpływu na rozmiar klasy.

Wielkość wystąpienie Każda klasa przynajmniej jeden bajt, nawet jeśli grupa jest pusta, tak że różne przedmioty mają różne adresy.

Dodanie char zapewnia, że ​​różne obiekty będą miały różne adresy, więc kompilator nie doda do niego sztucznie żadnego. Rozmiar jest następnie sizeof(char) = 1.

Następnie dodajemy int, który (prawdopodobnie) dodaje 4 bajty na platformie. Kompilator następnie zdecyduje się na dopełnienie klasy, tak aby została wyrównana ze względu na wydajność/wymagania procesora i dodaje 3 puste bajty, tak aby rozmiar był teraz 1 + 3 + 4 = 8. Prawdopodobnie dodaje dopełnienie przed elementem int, więc zostanie wyrównany na granicy 4 bajtów, ale nie jest wymagany, chyba że wymaga tego Twój procesor.

Możesz przeczytać o wypełnieniu na the Wikipedia page.

+2

Spodziewam się, że będzie to "c --- iiii" zamiast "ciiii ---", jak sugeruje ta odpowiedź. – zch

+4

@zch Nie chciałem sugerować, że skoro to zależy od kompilatora. Ale zmienię kolejność dodawania i dodam notatkę, jeśli sprawi ona, że ​​będzie mniej dezorientująca. –

+0

bardzo dziękuję @SethCarnegie za wyjaśnienie. Wiem trochę o dopełnieniu, zagłębię się w niego głębiej, ponieważ mam wątpliwości, dlaczego nie ma dopełnienia, gdy deklarowany jest tylko jeden znak, nawet gdy granica ma 4 bajty. :) – user2100866

8

Istnieje wiele czynników, które decydują o wielkości obiektu klasy w C++. Czynniki te to:

  1. rozmiar wszystkich non-statycznych pól
  2. Zamówienie członków danych
  3. Byte wyrównanie lub bajt wyściółka
  4. Wielkość jego bezpośrednim klasy bazowej
  5. Istnienie funkcji wirtualnego (s) (Dynamiczny polimorfizm za pomocą funkcji wirtualnych).
  6. Compiler wykorzystywane
  7. tryb dziedziczenia (spadku) wirtualnego

Można znaleźć więcej tutaj http://www.cprogramming.com/tutorial/size_of_class_object.html

Powiązane problemy