Я пытаюсь проверить размер класса. Кроме того, я новичок в C++. У меня есть два класса, разница между двумя классами состоит только в том, что в нем есть 8 методов. Почему нет разницы в размере класса в обоих случаях. Не могли бы вы объяснить мне понятия?
#include <iostream>
using namespace std;
class A
{
int b;
char c[2];
int func(int x, int y)
{
return x+y;
}
int func1(int x, int y)
{
return x+y;
}
int func2(int x, int y)
{
return x+y;
}
int func3(int x, int y)
{
return x+y;
}
int func4(int x, int y)
{
return x+y;
}
int func5(int x, int y)
{
return x+y;
}
int func6(int x, int y)
{
return x+y;
}
int func7(int x, int y)
{
return x+y;
}
};
class B
{
int b;
char c[2];
};
int main()
{
cout<<"Size of class A is "<< sizeof(A)<<endl;
cout<<"Size of class B is "<< sizeof(B)<<endl;
return 0;
}
Выходной сигнал следующий:
$ ./class_size.out
Size of class A is 8
Size of class B is 8
В точку. Методы не вносят вклад в размер объекта. Существует только одна копия каждой функции, и это передается как скрытый аргумент.
Вы заметите увеличение размера при добавлении первой виртуальной функции, поскольку для объектов с виртуальными функциями потребуется по крайней мере дополнительный указатель для динамического решения виртуальных вызовов.
sizeof()
измеряет размер экземпляра, а не самого класса. Программный код для методов класса не сохраняется вместе с int b
и char c[2]
; это была бы огромная потеря памяти, если бы у вас было сотни экземпляров с сотнями копий кода функции.
Таким образом, каждый экземпляр класса сохраняет только переменные-члены (а в случае виртуальных функций - указатель vtbl
). Код функции хранится только один раз для каждого класса и не вносит вклад в размеры экземпляра.
В общем, программа разделена на несколько сегментов в памяти, стек и куча содержат экземпляры классов и переменных, сегмент кода содержит инструкции, связанные с методами и функциями. Пространство для инструкций в классе не увеличивается в зависимости от количества экземпляров.
Оператор sizeof измеряет размер экземпляра класса. Этот экземпляр либо помещается в стек, либо в кучу, в зависимости от того, какой вы выделяете память для него динамически или нет.
Если вы создаете переменную-член как статическую, она становится переменной класса и не является частью sizeof. (Размещено в сегменте данных программы)