zoukankan      html  css  js  c++  java
  • 35、C++ Primer 4th笔记,特殊工具与技术,优化内存分配(2)

    9、正如定位new(placement new expression)表达式是使用allocator类的construct成员的低级选择,可以使用析构函数的显式调用作为调用destroy函数的低级选择。

    示例代码

    	for (T *p = first_free; p != elements; /*empty*/)
    		alloc.destroy(--p);
    	//上式表达与下式表达等价
    	p->~T();
    

    10、显式调用析构函数是清除对象本身,并没有释放对象所占的内存;调用operator delete函数不会运行析构函数,它只释放指定的内存。

    11、类通过定义自己的名为operator newoperator delete的成员,可以管理用于自身类型的内存。

    编译器看到类类型(for a class type)的newdelete表达式的时候,它查看该类是否有operator newoperator delete成员,如果类定义(或继承)了自己的成员newdelete函数,则使用那些函数为对象分配和释放内存;否则使用标准库版本。

    优化newdelete的行为的时候,只需要定义operator newoperator delete的新版本,newdelete表达式自己照管对象的构造撤销。

    12、在自定义newdelete的时候,应当成对定义。要用自定义全用,要用全局的也全用全局的。

    可以通过全局作用域确定操作符来强制newdelete表达式使用的是全局的库函数。

    示例代码

    Type *p = ::new Type; //uses global operator new
    ::delete p; //uses global operator delete
    

    13、如果基类有 virtual 析构函数,则传给 operator delete 的大小将根据被删除指针所指对象的动态类型而变化;如果基类没有 virtual 析构函数,那么,通过基类指针删除指向派生类对象的指针的行为,跟往常一样是未定义的。

        这些函数(operator newoperator delete)隐式地为静态函数,不必显式地将它们声明为static。成员 new delete 函数必须是静态的,因为它们要么在构造对象之前使用(operator new),要么在撤销对象之后使用(operator delete),因此,这些函数没有成员数据可操纵。像任意其他静态成员函数一样,new delete 只能直接访问所属类的静态成员。

    14、一个通用策略是预先分配一场原始内存来保存未构造的对象,创建新元素的时候,可以在一个预先分配的对象中构造;释放元素的时候,将它们放回预先分配对象的块中,而不是将内存实际返还给系统。这种策略常被称为维持一个自由列表。可以将自由列表实现为已分配但未构造的对象的链表。

  • 相关阅读:
    C# 压缩组件介绍与入门
    《Effective C#》快速笔记(六)-
    原生JS实现简单富文本编辑器
    oracle 给表字段把VARCHAR2 换成 CLOB
    java.lang.NoClassDefFoundError: javax/servlet/ServletOutputStream
    Idea中Module is not specified解决办法
    JS用正则替换特殊字符
    对List<Map>里的map的某个属性重复的值进行处理的方法
    ……
    使用原生js 实现点击消失效果
  • 原文地址:https://www.cnblogs.com/mydomain/p/2053883.html
Copyright © 2011-2022 走看看