《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