Где в памяти располагаются функции-поля классов?
Разбирался с классами и стало интересно,как и где хранятся функции-поля классов. Если получить размер класса,то размер будет равен сумме размеров всех нестатических полей + выравнивание. Не совсем понимаю,где тогда размещаются функции классов и их статические поля.Или для каждого класса будет своя функция или для всех классов используется 1 функция-поле класса?
Так же пытался найти адрес функций,но не получилось:
class myclass {
public:
int a;
float b;
static int c;
int func1() { a = 4; return a; };
int func2() { a = 6; return a;};
};
int myclass::c;
int main()
{
myclass a1;
cout <<sizeof(myclass)<< endl; //8 байт
cout<<"addr class: "<< &a1 <<endl; //67C5DDF7A0
cout << "addr a class: " << &a1.a << endl; //67C5DDF7A0
cout << "addr b class: " << &a1.b << endl; //67C5DDF7A4
cout << "addr b class: " << &a1.c << endl; //7FF6866996A0
cout << "addr func1 class: " << &myclass::a << endl; //1 (Что мы получаем?)
cout << "addr func1 class: " << &myclass::func1 << endl; //1 (Что это?)
cout << "addr func2 class: " << &myclass::func2 << endl; //1
cout << "addr func1 class: " << &a1.func1 << endl; //ошибка компиляции (Интересно почему?)
cout << "addr func2 class: " << &a1.func2 << endl; //ошибка компиляции
}
Ответы (1 шт):
Функции классов - это просто код. Который при вызове невиртуальных функций известен сразу, так что его (его адрес, точнее) никуда не надо включать, он разрешается при компиляции.
Если это виртуальные функции - то их адреса хранятся в таблице виртуальных функций и опять же эта таблица одна на класс, так что в каждый объект добавляется только указатель на нее.
Поэтому функции ничего (почти ничего - указатель на vtable для виртуальных) в размер класса не вносят.