Как операторът c++ sizeof изчислява размера?

Създадох клас X, който има само 2 публични функции (конструктор и деструктор) и използвайки оператор sizeof, размерът на класа става 1.

Когато добавя частен член с данни от тип char към горната декларация на клас, размерът все още е 1. Накрая добавям целочислен тип към него като член с данни на клас и сега размерът е 8 байта.

Моля, обяснете ми как се изчислява размерът на класа.


person Ishita    schedule 22.02.2013    source източник
comment
Моля, публикувайте съответния код.   -  person Anirudh Ramanathan    schedule 23.02.2013


Отговори (2)


Първо, осъзнайте, че функциите, които не са виртуални, нямат ефект върху размера на класа.

Размерът на екземпляр на всеки клас е поне 1 байт, дори ако класът е празен, така че различните обекти ще имат различни адреси.

Добавянето на char гарантира, че различните обекти ще имат различни адреси, така че компилаторът да не добавя изкуствено такъв към размера. Тогава размерът е sizeof(char) = 1.

След това добавяте int, което (вероятно) добавя 4 байта към вашата платформа. След това компилаторът решава да подпълни класа, така че да бъде подравнен по причини, свързани с производителността/изискванията на процесора, и добавя 3 празни байта, така че размерът сега да е 1 + 3 + 4 = 8. Вероятно добавя подложката преди члена int, така че че ще бъде подравнен на граница от 4 байта, но не е задължително, освен ако вашият процесор не го изисква.

Можете да прочетете за подпълването на страницата на Wikipedia.

person Seth Carnegie    schedule 22.02.2013
comment
Бих очаквал да бъде c---iiii, а не ciiii---, както предполага този отговор. - person zch; 23.02.2013
comment
@zch Не исках да намеквам това, тъй като зависи от компилатора. Но ще променя реда на добавяне и ще добавя бележка, ако това го прави по-малко объркващо. - person Seth Carnegie; 23.02.2013
comment
благодаря много @SethCarnegie за обяснението. Знам малко за подплънките, ще се заровя по-дълбоко в него, тъй като се съмнявам защо няма подложка, когато е деклариран само един символ, дори когато границата е 4 байта. :) - person Ishita; 23.02.2013
comment
@user2100866 Компилаторите обикновено се опитват да подравнят структурите така, че да бъдат кратни на размера на най-големия член. Така че, когато имате само char, най-големият член е 1, така че размерът е непроменен. За int, това е 4, така че размерът е кратен на 4. Ето защо не го допълва, когато е просто символ. - person Seth Carnegie; 23.02.2013

Има много фактори, които определят размера на обект от клас в C++. Тези фактори са:

  1. Размер на всички нестатични членове на данните
  2. Ред на членовете на данните
  3. Подравняване на байтове или допълване на байтове
  4. Размер на неговия непосредствен базов клас
  5. Съществуването на виртуална функция(и) (Динамичен полиморфизъм, използващ виртуални функции).
  6. Използва се компилатор
  7. Начин на наследяване (виртуално наследяване)

Можете да намерите повече тук http://www.cprogramming.com/tutorial/size_of_class_object.html

person psu    schedule 22.02.2013