2013年1月13日日曜日

newとdeleteのオーバーライド

普通のC++プログラムならnewをオーバーライドする事はまずないだろうけど、
USBのOHCIで構造体にアライメントが必要な時に使うとわかりやすいと思って使ってみた。
構造体を使う側はどこに配置されるか気にしないでnewでインスタンスを作ることが出来ます。

次の例は16バイト境界に配置しなければならない構造体にnewのオーバーライドを実装した例です。
もちろん、ヒープではなくて、独自のメモリプールから切り出すのにも使えます。
struct HCED {
省略 
   }

    inline void* operator new(size_t size) {
        void* p;
        if (posix_memalign(&p, 16, size) == 0) {
            return p;
        }
        return NULL;
    }

    inline void operator delete(void* p) {
        free(p);
    }

};

__PRETTY_FUNCTION__ でみると 自動でstatic関数になるようです。

(2013/1/13)
---

0 件のコメント: