先看一个代码:
#include<iostream>
using namespace std;
class Person
{
};
int main()
{
Person p;
cout << "size of p = " << sizeof(p) << endl; // 1。
system("pause");
return 0;
}
空对象占用内存空间为:1字节。
因为C++ 编译器会给每一个空对象也分配一个字节空间,是为了区分多个空对象占内存的位置情况。多个独一无二的空对象,每个一个空对象也应该有一个独一无二的内存地址。
加入一个属性看看。
class Person
{
int m_A; // 非静态成员变量。
};
int main()
{
Person p;
cout << "size of p = " << sizeof(p) << endl; // 4。
system("pause");
return 0;
}
加一个静态成员变量:
#include<iostream>
using namespace std;
class Person
{
int m_A; // 非静态成员变量。 属于类的对象上的。
static int m_B; // 静态成员变量。
};
int Person::m_B = 19; // 静态成员变量:类内声明;类外初始化。
int main()
{
Person p;
cout << "size of p = " << sizeof(p) << endl; // 4。
system("pause");
return 0;
}
静态成员不属于某一个类的对象上面:开辟在内存四区中的全局区域。
再加一个成员函数:
#include<iostream>
using namespace std;
class Person
{
int m_A; // 非静态成员变量。 属于类的对象上的。
static int m_B; // 静态成员变量。 不属于类的对象上的。
void func() {}; // 非静态成员函数。 不属于类的对象上的。
void func(int a) // 带参成员函数 不属于类的对象上的。
{
cout << a << endl;
}
};
int Person::m_B = 19; // 静态成员变量:类内声明;类外初始化。
int main()
{
Person p;
cout << "size of p = " << sizeof(p) << endl; // 4。
system("pause");
return 0;
}
依然是4。
所以:有了一个结论:
- 成员变量和成员函数 分开存储。
- 静态成员也不属于类对象上。
非静态成员函数也是独一无二的,他也不属于某一个类对象上。
再添加一个静态成员函数:
#include<iostream>
using namespace std;
class Person
{
int m_A; // 非静态成员变量。 属于类的对象上的。
static int m_B; // 静态成员变量。 不属于类的对象上的。
void func() {}; // 非静态成员函数。 不属于类的对象上的。
void func(int a) // 带参成员函数 不属于类的对象上的。
{
cout << a << endl;
}
static void func1() {}; // 静态成员函数。 不属于类的对象上的。
};
int Person::m_B = 19; // 静态成员变量:类内声明;类外初始化。
int main()
{
Person p;
cout << "size of p = " << sizeof(p) << endl; // 4。
system("pause");
return 0;
}
输出依然是4。
结论:只有非静态成员变量属于类的对象上(算类占空间。)。其他的都不属于。
基于以上的实验:补充一点:内存对齐
class Test
{
int a;
char b;
};
int main()
{
Test t;
cout << "size of t:" << sizeof(t) << endl; // 4字节
system("pause");
return 0;
}
一个int是4字节,一个char是1字节。结果输出是8字节。
#include<iostream>
using namespace std;
class Test
{
int a;
char b;
char c;
};
int main()
{
Test t;
cout << "size of t:" << sizeof(t) << endl; // 8字节
system("pause");
return 0;
}
多个char:还是8字节。
#include<iostream>
using namespace std;
class Test
{
char d;
int a;
char b;
};
int main()
{
Test t;
cout << "size of t:" << sizeof(t) << endl; // 12
system("pause");
return 0;
}
若把char放前面就是12字节。
32位系统:内存存取粒度为4字节。