1. new基于每个对象分配内存的事实可能会对某些类强加不可接受的运行时开销,这样的类可能需要使用户级的类类型对象分配能够更快一些.这样的类使用的通用策略是,预先分配用于创建新对象的内存,需要时在预先分配的内存中构造每一个新对象.
对于未构造的内存中的对象进行赋值而不是初始化,其行为是未定义的.对许多类而言,这样做引起运行时的崩溃.赋值设计删除现存对象,如果没有现存对象,赋值操作符中的动作就会有灾难性效果.
2. C++提供下面两种方法分配和释放未构造的原始内存.
■ allocator类:他提供可感知类型的内存分配.这个类支持一个抽象接口,以分配内存并随后使用该内存保存对象.
■ 标准库中的operator new和operator delete,他们分配和释放需要大小的原始的,未类型化的内存.
此外和提供不同的方法在原始内存中构造和撤销对象.
■ allocator类定义了名为construct和destroy的成员,其操作正如他们的名字所指出的那样:construct成员在未构造内存中初始化对象,destroy成员在对象上运行适当的析构函数.
■ 定位new表达式接受指向未构造内存指针,并在该空间中初始化一个对象或者数组.
■ 可以直接调用对象的析构函数来撤销对象,运行析构函数并不释放对象所在的内存.
■ 算法uninitialized_fill和uninitialized_copy像fill和copy算法一样执行,除了他们在目的地构造对象而不是给对象赋值之外.
注解:现代C++程序一般应该使用allocator类来分配内存,它更安全灵活.但是在构造对象的时候,用new表达式比allocator∷construct成员更加灵活.而且有几种情况下必须得使用new.
3. allocator类与定制算法
allocator<T> a; |
定义名为a的allocator对象可以分配内存或构造T类型的对象 |
a.allocate(n) |
分配原始的未构造内存以保存T类型的n个对象 |
a.deallocate(p,n) |
释放内存,在名为p的T*指针中包含的地址处保存T类型的n个对象.运行调用deallocate之前在该内存中构造的任意对象的destroy是用户的责任 |
a.construct(p,t) |
在T*指针p所指内存中构造一个新元素,运行T类型的复制构造函数用t初始化该对象 |
a.destroy(p) |
运行T*指针p所指对象的析构函数 |
uninitialized_copy(b,e,b2) |
从迭代器b和e指出的输入范围将元素复制到从迭代器b2开始的为未构造的原始内存中.该函数在目的构造元素,而不是给他们赋值.假定由b2指出的目的地足以保存输入范围中元素的副本 |
uninitialized_fill(b,e,t) |
将由迭代器b和e指出的范围中对象初始化为t的副本,假定该范围是未构造的原始内存,使用复制构造函数构造对象 |
uninitialized_fill_n |
将由迭代器b和e指出的范围中至多n个对象初始化为t的副本.假定范围至少为n个元素的大小.使用复制构造函数构造对象 |
allocator类将内存分配和对象构造分开,当allocator对象分配内存的时候,它分配适当大小并排列成保存给定类型对象的空间.但是它分配的内存是未构造的,allocator的用户必须分配用construct和destroy防止在该内存中的对象.
优化内存分配其余部分略(我发现这部分比较深奥,而且在工作中很少用到,所以…)
4. 通过下面两个操作符提供RTTI(运行时类型识别)
1). typeid操作符,返回指针或者引用所指对象的实际类型.
2). dynamic_cast操作符,将积累类型 指针或者引用安全的转换为派生类型的指针或者引用.
这些操作符只为带有一个或多个虚函数的类返回动态类型信息,对于其他类型,返回静态(即编译时)类型的信息.
使用动态强制类型转换要小心,只要有可能,定义和使用虚函数比直接接管类型管理好的多.
5. 可以使用dynamic_cast操作符将基类类型对象的引用或指针转换为同一继承层次中其他类型的引用或指针.与dynamic_cast一起使用的指针必须是有效的---它必须是0或者指向一个对象.
typeid(e):typeid操作符可以与任何类型的表达式一起使用.e表示对象的表达式.内置类型的表达式以及常量都可以用作typeid操作符的操作数.如果操作数不是类类型或者没有虚函数的类,则typeid操作符指出操作数度静态类型;如果操作数是定义了至少一个虚函数的类类型,则在运行是计算类型.
只有当typeid的操作数是带虚函数的类类型的对象的时候,才返回动态类型信息.测试指针(相对于指针指向的对象)返回指针的静态的、编译时类型.
type_info类随编译器而变.一些编译器提供附加的成员函数,那些函数提供关于程序中所用类型附加信息.
其余内容略!