1. placement new 方法
如:pi = new (ptr) int; //placement new
括号里的参数是一个指针,它指向一个内存缓冲器,new操作将在这个缓冲器上分配一个对象。Placement new的返回值是这个被构造对象的地址(比如扣号中的传递参数)。placement new主要适用于:在对时间要求非常高的应用程序中,因为这些程序分配的时间是确定的;STL 标准库中 allocator 空间分配器, 就使用了这个语法。
先使用 malloc 分配内存p. 然后 在该内存内构造自己的类对象 new(p) T1(value) ; T1 是构造的类型,value 是类型的值
2. naked function
当你的函数内部较简单,用不到太多寄存器。或者需要根据上下文决定一些寄存器变量的时候。可以用naked 函数。对于一般的函数,如果必要的话,进入函数时编译器会产生代码来保存ESI,EDI,EBX,EBP寄存器,退出函数时则产生代码恢复这些寄存器的内容。naked call不产生这样的代码。使用naked函数,我们可以自己编写干干净净的函数,特别是当你代码没有使用这些寄存器的时候。可以像内联函数一样,省略一些操作。
void __declspec(naked) MyNakedFunction() { // Naked functions must provide their own prolog. __asm { PUSH EBP MOV ESP, EBP SUB ESP, __LOCAL_SIZE } // And we must provide epilog. |
在MFC库中很多窗口基类中调用派生类的消息处理函数。因为windows消息众多,如果为每个消息都设立虚函数,而每个虚函数都占用4 bytes,那样很多类体积将非常庞大。而且有些地方基类设计时考虑到派生类在此可能要作些处理,又不想使用虚函数的话也可以使用指向成员函数的指针。如下面的类。如果派生类没有修改pf成员,在release中 (this->*pf)() 将被优化掉。而且使用指向成员函数的指针也不用定死函数名字。
class animate { typedef void (animate::*pfun)(); public: animate() {pf=static_cast<pfun>(donothing);} void sleep() { cout<<"animate sleep"<<endl; (this->*pf)(); } void donothing(){} pfun pf; }; |