2013-06-24 1 views
3

Вот код, который печатает размер различных классовРазмер C++ классов

#include <iostream> 

using namespace std; 

class EmptyClass 
{  
}; 

class AbstractClass 
{ 
    public: 
      virtual void funcOne() = 0; 
      virtual void funcTwo() = 0; 
}; 

class NotAbstrClass 
{ 
    public: int virtFunc(int); 
}; 

class MixClass 
{ 
    public: 
      virtual void clFunc(int); 
      static int i; 
      int j; 
}; 

int main() 
{ 
    // Print size of class or class objects 
    cout<<"Size of empty class: "<< sizeof(EmptyClass)<<endl;   
    cout<<"Size of Abstract class :"<< sizeof(AbstractClass)<<endl; 
    cout<<"Size of Non Abstract class: "<< sizeof(NotAbstrClass)<<endl; 
    cout<<"Size of Mix class: "<< sizeof(MixClass)<<endl; 
    return 0; 
} 

Выход программы на C++ 11 компилятором

Size of empty class: 1 
Size of Abstract class :4 
Size of Non Abstract class: 1 
Size of Mix class: 8 

Я понимаю, почему Пустой класс имеет размер 1 Size of empty class object. Для абстрактного класса объект хранит указатель для реализации механизмов вызова виртуальных функций. Но как насчет размеров других объектов класса (NotAbstrClass и MixClass)?

+0

Поймите, что все SizeOf() говорит вам, по сути зависит от конкретного компилятора в той или иной операционной системы и те особенности Настройки. –

+0

@SebastianRedl: вы правы. Но на данный момент считаю, что я использую 32-битную архитектуру настольного процессора с 32-разрядной ОС. В таком случае вы можете использовать конкретные значения для размера целочисленных типов (4 байта) и типа указателя (4 байта). – nurabha

+1

дубликат http: // stackoverflow.com/questions/4766323/how-to-define-sizeof-class-with-virtual-functions/4766385 # 4766385 – kfsone

ответ

0

NotAbstrClass как пустой класс, когда мы говорим о размерах бит, так как у него нет данных. У MixClass есть указатель виртуальной функции (4 байта на 32-разрядной машине) и int (также 4 байта).

2

NotAbstrClass не имеет данных, поэтому это тоже пустой класс. Поскольку классы не могут быть нулевого размера, вы получаете то же лечение, что и EmptyClass.

MixClass имеет виртуальную функцию и 1 нестатический элемент данных. Кажется, каждый из них (vptr и int) занимает 4 байта на вашей платформе, поэтому размер составляет 8 байтов.

+0

Статический член данных MixClass является частью пространства имен классов, разделяемым всеми объектами класса, но не является частью объекта класса. По этой причине это не способствует размеру объекта MixClass? – nurabha

+0

@nurabha Ты сам ответил сам. Статический член данных разделяется между всеми экземплярами этого класса и, как таковой, не принадлежит ни одному отдельному экземпляру. Если он не является частью какого-либо экземпляра, как он может добавить размер одного? – Praetorian

1

Согласно Girish Шетти:

Есть много факторов, которые решают размер объекта класса в C++. Эти факторы являются:

  • Размер всех нестатических членов данных
  • Порядок элементов данных
  • Байт выравнивания или байт набивка
  • Размер его непосредственного базового класса
  • Существование виртуальной функции (ы) (динамический полиморфизм с использованием виртуальных функций).
  • Компилятор используется
  • Режим наследования (виртуальное наследование)

Здесь есть некоторые связанные веб-сайт, я думаю, что это может быть полезным для вас.

Определить размер объекта класса: макет http://www.cprogramming.com/tutorial/size_of_class_object.html

Память: http://www.phpcompiler.org/articles/virtualinheritance.html

И, если вы используете MVSC, вы можете сбросить все распределение памяти всех классов в вашем решении с -d1reportAllClassLayout вроде этого:

сл -d1reportAllClassLayout main.cpp

+0

Кто такой девчонка? – nurabha

+0

Girish Shetty - автор первой ссылки на бумагу, которую я называю выше. Итак, я даю ему имя для справки. :) – HappyTran

+0

ой. Хорошо. Благодаря! – nurabha