结论:
非静态成员变量:属于对象,随着对象的建立而分配内存,全局对象和静态对象则存储在全局区,局部对象则存储在栈区,动态对象则存储在堆区。
静态成员变量:属于类,存储在全局区。
非静态成员函数:属于类,存储在代码区。
静态成员函数:属于类,存储在代码区。
案列:
tips:创建类不会分配内存,只有在实例化对象时才分配内存。
1、当类是空类时,实例化的对象占几个字节?(1 个字节)
class Person { //空类
};
Person p; //对象p占 1 个字节
解释:C++编译器会给每个空对象都分配 1 字节的内存空间,目的是区分空对象之间所占用内存的位置。 // 比如当我创建了多个空对象时,Person p1, p2, p3... 若不给它们分配内存空间,则编译器就无法区分空对象,只有给每个空对象一个位置,编译器才能准确区分。( 因为每个对象在内存中的位置必须是独一无二的,若不分配内存,可以理解为多个对象同时在一块内存中,编译器不知道该返回哪一个,虽然这样理解是不对的 )
2、类中有非静态成员变量(普通成员变量),实例化的对象占几个字节?
class Person {
int m_A; //普通成员变量
};
Person p; //对象p占 4 个字节
对象所占的内存空间 由类中 普通成员变量 所占内存空间 确定。
如上面 int 类型占 4 个字节,所以对象也占 4 个字节,同理若有两个 int 类型的普通成员变量,则对象应占 8 个字节的内存空间。
3、类中还有其他成员变量或成员函数时,实例化的对象占几个字节?
class Person {
int m_A; //普通成员变量 属于对象
static int m_B; //静态成员变量 属于类
void func(){ } //普通成员函数 属于类
static void func(){ } //静态成员函数 属于类
};
Person p; //对象p占 4 个字节
解释:最开始的结论已经给出:只有普通成员变量是属于对象的,其他成员都不会占用对象的内存
小白博主还在学习中,若有错误请指出!