《C++应用程序性能优化》之对象及其内存(一)
来源:互联网 发布:哔哩哔哩软件下载 编辑:程序博客网 时间:2024/06/05 07:20
由于在学习过程中遇到一些其它的问题,博主查阅其它资料解决了,部分内容不是出自该书,但也一并记录。
1、对象创建
C++对象可以通过定义变量,通过new操作符或者通过实现创建(指一些中间临时变量,如函数传递参数,返回参数)。在函数内通过定义变量、或者传参创建的对象,内存在栈上(包括主函数)。在全局定义的对象内存在全局/静态数据区,而通过new创建的对象内存在堆上。
2、开工函数、收工函数
“开工函数”在main函数之前运行,完成全局变量内存分配、初始化等。“收工函数”则在main之后运行,回收全局变量的内存并销毁之。如果将一个程序看做一个对象,则开工函数就是这个程序的构造函数,而收工函数则是这个对象的析构函数。
注:这一段不是出自本书
3、对象的生命周期
(1)、通过定义变量创建的对象,其生命周期由其作用域决定,进入作用域时被创建,退出作用域时被销毁。值得注意的是静态变量,虽然它也在作用域内声明定义,但事实上,其内存在静态数据区,因此早在开工函数运行时,其内存就已被分配好,这样在函数第一次调用时,创建静态对象,启用了事先分配好的内存,直到收工函数运行时才被释放掉。
(2)、通过new创建的对象,其生命周期是任意的,直到启用delete销毁、对象正常析构或者程序退出,造成内存泄漏。通过引用new创建的对象需要通过delete &销毁:
A &a = *new A;//引用new创建的对象
delete &a; //销毁并析构引用的对象
其本质与new创建的对象一致,可避免指针操作。(不是出自本书)
有人也许会问new分配失败怎么办,对象还存在吗?事实上,new也是分类型的,普通的new要么分配成功,返回对象地址,要么分配失败,抛出异常std::bad_alloc。详情见下节。
(3)、实现创建对象,通常指函数传参,返回参数等中间变量,容易被忽略。这也是程序性能下降的原因。解决方法是采用引用传参,返回引用等。
4、plain new,nothrow new和placement new
plain new:一般的new,分配失败则抛出异常std::bad_alloc。示例:int *a = new int[20];
nothrow new:顾名思义,没有抛出的new,分配失败返回NULL。示例:int *a = new(nothrow) int[20];
placement new:重复使用一块较大的内存块,即这种类型的new不会分配任何内存,适合在一些对运行时间要求比较高的程序上,使用略显复杂。
placement new使用方法:
(1)、预先分配内存:char * buff = new char[1024];//char buff[1024] 等等,有内存的正常使用权即可
(2)、启用内存: A *a = new(buff) A;//启用buff的内存,并调用A的构造函数
(3)、析构对象:a.~A();//只会析构A,不会释放buff中的内存,但是如果对象中存在指针,指针指向其它区域的动态内存,调用delete时该内存会被释放掉,这时可重载new/delete,将该内存也放到buff上来解决,后面我会尝试用这个方法写一个内存池,所有新分配的内存都在buff中才有意义对吧?
(4)、释放内存:delete[]buff;//释放内存
注:此段来自互联网(点此查看)
0 0
- 《C++应用程序性能优化》之对象及其内存(一)
- 《C++应用程序性能优化》内存管理篇笔记(一)
- 《C++应用程序性能优化》之程序内存
- android性能优化(一)内存优化
- C++应用程序性能优化笔记(二)——对象生命周期和内存布局
- 《c++应用程序性能优化》读书笔记(一)
- C\C++应用程序性能优化
- Android 性能优化(一)内存篇
- 性能优化(一)堆内存分析
- tomcat性能优化及其jvm内存分析
- Unity3D 内存优化(一)对象池
- C++应用程序性能优化(书)内存管理
- [转]C++ 应用程序性能优化----内存池
- C++ 应用程序性能优化 -- 内存池
- C++ 应用程序性能优化---内存池技术
- C++ 应用程序性能优化 -- 内存池
- C++ 应用程序性能优化:内存池
- 【编程语言】C++应用程序性能优化 笔记(一)
- Java transient关键字使用小记
- 《深入理解JAVA虚拟机》笔记7——类文件结构
- 使用 NuGet 管理项目库
- Caffe代码阅读集锦
- 关于csdn博客的几点疑问
- 《C++应用程序性能优化》之对象及其内存(一)
- linux系统编程之信号(一):信号基本概述
- HTML—文本标签
- Python个人学习笔记
- C++继承
- ProGuard Examples
- 【Python那些事儿】Python中的读写文件
- Spring MVC服务器不响应
- C++多态