类
- C++中可以使用struct、class来定义一个类
- struct和class的区别
- struct的默认成员权限是public
- class的默认成员权限是private
// struct:
struct Person{
int m_age;
void run(){
cout << m_age << endl;
}
};
//class:
class Person{
public:
int m_age;
void run(){
cout << m_age << endl;
}
};
// ------------
int main() {
Person person;
person.m_age = 10;
person.run();
Person *pPerson = &person;
pPerson->m_age = 20;
pPerson->run();
return 0;
}
- 上面代码中person对象、pPerson指针的内存都是在函数的
栈空间,自动分配和回收的
- 可以尝试反汇编struct和class,看看是否有其他区别【无区别】
- 实际开发中,用class表示类比较多
C++编程规范:(变量名规范参考)
- 全局变量:g_
- 成员变量:m_
- 静态变量:s_
- 常量:c_
- 使用驼峰标识
ps:每个人都可以有自己的编程规范,没有统一的标准,没有标准答案,没有最好的编程规范
对象的内存布局:
思考:如果类中有多个成员变量,对象的内存又是如何布局的?
Person person;
person.m_age = 10;
person.run();
// 在函数里创建对象,用上面的这种方式,它的内存存放在栈空间
每个应用都有自己独立的内存空间,其内存空间一般都有以下几大区域:
- 代码段(代码区)
- 用于存放代码
- 数据段(全局区)
- 用于存放全局变量等
- 栈空间
- 每调用一个函数就会给它分配一段连续的栈空间,等函数调用完毕后会自动回收这段栈空间
- 自动分配和回收
- 堆空间
- 需要主动去申请和释放
// 应用的内存空间布局:
|-------------------|
| |
| 栈空间 |
|-------------------|
| 堆空间 |
|-------------------|
| 代码区 |
|-------------------|
| 全局区 |
| |
|-------------------|
堆空间
- 堆空间的申请\释放
- malloc \ free
- new \ delete
- new [] \ delete []
- 注意
- 申请堆空间成功后,会返回那一段内存空间的地址
- 申请和释放必须是1对1的关系,不然可能会存在内存泄露
- 现在的很多高级编程语言不需要开发人员去管理内存(比如Java),屏蔽了很多内存细节,利弊同时存在
- 利:提高开发效率,避免内存使用不当或泄露
- 弊:不利于开发人员了解本质,永远停留在API调用和表层语法糖,对性能优化无从下手
堆空间的初始化
// *p1未初始化
int *p1 = (int *)malloc(sizeof(int));
int *p2 = (int *)malloc(sizeof(int));
// 把*p2的每一个字节都初始化为0
memset(p2, 0, sizeof(int));
int *p1 = new int; // 未初始化
int *p2 = new int(); // 初始化为0
int *p3 = new int(5); // 初始化为5
int *p4 = new int[3]; // 未初始化
int *p5 = new int[3](); // 3个数组元素初始化为0
int *p6 = new int[3]{}; // 3个数组元素初始化为0
int *p7 = new int[3]{5};// 数组首元素初始化为5,其他初始化为0
memset
memset函数是将较大的数据结构(比如对象、数组等)内存清零的比较快的方法
Person person;
person.m_id = 10;
person.m_age = 10;
person.m_height = 10;
memset(&person, 0, sizeof(person));
Person persons[] = {{0,3,105},{1,4,174},{2,6,182}};
memset(persons, 0, sizeof(persons));
ps:memset分配几个字节,是由操作系统底层实现的
对象的内存
- 对象的内存可以存在于3种地方
- 全局区(数据段):全局变量
- 栈空间:
函数
里面的局部变量 - 堆空间:动态申请内存(malloc、new等)
// 全局区
Person g_person;
int main() {
// 栈区
Person person;
// 堆区
Person *p = new Person;
return 0;
}
this
-
隐式参数
-
汇编长啥样?
-
this是指向对象的指针
-
是语法糖
-
通过指针修改对象成员变量的汇编样子
-
指针间接访问效率,不见得就比对象高,但是,有的地方必须使用指针,例如,堆空间,另外,方便
-
int3,CC CC
网友评论