我处理了类,并且对类的函数字段的存储方式和位置变得有趣。如果你得到类大小,那么大小将等于所有非静态字段大小的总和+ 对齐。我不太明白类函数及其静态字段在哪里。或者每个类都有自己的函数,还是所有类都使用一个类字段函数?
我也试图找到函数的地址,但没有奏效:
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; //ошибка компиляции
}
类函数只是代码。在调用非虚拟函数时,它是立即知道的,因此它(它的地址,更准确地说)不需要包含在任何地方,它在编译期间被解析。
如果这些是虚函数,则它们的地址存储在虚函数表中,并且该表也是每个类一个,因此每个对象只添加一个指向它的指针。
因此,这些函数对类的大小没有任何贡献(几乎没有 - 指向虚拟表的指针)。