C++编程中的一些不太常用C++语法

[来源] 达内    [编辑] 达内   [时间]2013-01-29

括号里的参数是一个指针,它指向一个内存缓冲器,new操作将在这个缓冲器上分配一个对象。Placement new的返回值是这个被构造对象的地址(比如扣号中的传递参数)。placement new主要适用于

  1. plaC++(C++培训 )ement 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.

  __asm

  {

  POP EBP

  RET

  }

  }

  3. 指向类成员函数的指针

  在MFC库中很多窗口基类中调用派生类的消息处理函数。因为windows消息众多,如果为每个消息都设立虚函数,而每个虚函数都占用4 bytes,那样很多类体积将非常庞大。而且有些地方基类设计时考虑到派生类在此可能要作些处理,又不想使用虚函数的话也可以使用指向成员函数的指针。如下面的类。如果派生类没有修改pf成员,在release中 (this->*pf)() 将被优化掉。而且使用指向成员函数的指针也不用定死函数名字。

  class animate

  {

  typedef void (animate::*pfun)();

  public:

  animate() {pf=static_cast(donothing);}

  void sleep()

  {

  cout<<"animate sleep"<

  (this->*pf)();

  }

  void donothing(){}

  pfun pf;

  };

资源下载