C++ 数据存储位置
引言
本文探讨了两个问题:
- 全局变量和的静态变量的位置。
- 类对象中包含哪些成员。
全局变量和静态变量的存储位置
#include<iostream>
using namespace std;
int g1;
int g2 = 0;
int g3 = 1;
int g4 = 2;
static int sg5 = 3;
int main() {
//代码区 .text
static int sg6 = 1;
static int sg7;
static int sg8 = 0;
cout << "代码区起始位置 main = " << main << endl;
cout << "全局变量\tg1未初始化\t\tg1的地址是:" << &g1 << endl;
cout << "全局变量\tg2初始化为0\t\tg2的地址是:" << &g2 << endl;
cout << "全局变量\tg3初始化为1\tg3的地址是:" << &g3 << endl;
cout << "全局变量\tg4初始化为2\tg4的地址是:" << &g4 << endl;
cout << "静态全局变量\tsg5初始化为3\tsg5的地址是:" << &sg5 << endl;
cout << "静态局部变量\tsg6初始化为1\tsg6的地址是:" << &sg6 << endl;
cout << "静态全局变量\tsg7未初始化\t\tsg7的地址是:" << &sg7 << endl;
cout << "静态全局变量\tsg8初始化为0\t\tsg8的地址是:" << &sg8 << endl;
system("pause");
return 0;
}
模型图
虽然它们的存储位置有一点点细微的不同,但是他们都在代码区。
成员变量和成员函数的从属关系
先说结论:只有非静态成员变量输入类对象。
成员函数不属于类对象
#include<iostream>
class Person {
void func01();
static void func02();
};
int main() {
Person p;
std::cout << sizeof(p);
return 0;
}
输出结果为:1。因此可以得出静态成员函数和非静态成员函数都不属于对象p。
静态成员变量不属于类对象
#include<iostream>
class Person {
static int m_salary;
};
int main() {
Person p;
std::cout << sizeof(p);
return 0;
}
输出结果为:1。因此可以得出静态成员变量不属于对象p。
非静态成员变量属于类对象
#include<iostream>
class Person {
int m_salary;
};
int main() {
Person p;
std::cout << sizeof(p);
return 0;
}
输出结果为:4。因此可以得出静态成员变量不属于对象p。
为什么空类的对象大小为1
百度搜索即可。
总结
- 静态变量和全局变量的是存放在一起的。
- 只有非静态成员变量输入类对象。