почему эти два класса имеют одинаковый размер, метод не соответствует размеру класса?

0

Я пытаюсь проверить размер класса. Кроме того, я новичок в 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
  • 1
    С чего бы им? Если вы создаете миллион объектов, вам не нужно восемь миллионов ненужных копий функций.
Теги:

3 ответа

4
Лучший ответ

В точку. Методы не вносят вклад в размер объекта. Существует только одна копия каждой функции, и это передается как скрытый аргумент.

Вы заметите увеличение размера при добавлении первой виртуальной функции, поскольку для объектов с виртуальными функциями потребуется по крайней мере дополнительный указатель для динамического решения виртуальных вызовов.

  • 0
    +1 за упоминание виртуальных методов. Подробнее об этом можно прочитать здесь: stackoverflow.com/questions/4766323/…
1

sizeof() измеряет размер экземпляра, а не самого класса. Программный код для методов класса не сохраняется вместе с int b и char c[2]; это была бы огромная потеря памяти, если бы у вас было сотни экземпляров с сотнями копий кода функции.

Таким образом, каждый экземпляр класса сохраняет только переменные-члены (а в случае виртуальных функций - указатель vtbl). Код функции хранится только один раз для каждого класса и не вносит вклад в размеры экземпляра.

0

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

Оператор sizeof измеряет размер экземпляра класса. Этот экземпляр либо помещается в стек, либо в кучу, в зависимости от того, какой вы выделяете память для него динамически или нет.

Если вы создаете переменную-член как статическую, она становится переменной класса и не является частью sizeof. (Размещено в сегменте данных программы)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню