more-effective-c++シーケンス1 newとdeleteのテスト

3846 ワード

more-effective-c++シーケンス1 newとdeleteのテスト


1.スタックメモリにオブジェクトを割り当て、スタックメモリの割り当てに独自の方法を使用します。

Widget *pWidget = new Widget():
1,operator new割り当てメモリを呼び出す
2メモリ上のオブジェクトをコンストラクション関数に呼び出す
3、Widget*に変換してpWidgetに付与
したがってoperator newとdeleteを書き換えることで、メモリの割り当て方法を自分で決めることができます.
次のコードはoperator newで呼び出されたmalloc、operator deleteで呼び出されたfreeです.
もちろんメモリプールの観点を使って、operator newはGetMemoryを呼び出し、operator deleteはReturnMemoryを呼び出すこともできます.
これにより、独自のメモリ割り当て方法をカスタマイズできます.
#include <iostream>
using namespace std;


/*
new operator operator new Widget 
 operator new delete 。
*/
#define TRACE_FUCTION_AND_LINE(fmt, ...) printf("[%20s:%4d]"fmt"
",__FUNCTION__, __LINE__, ##__VA_ARGS__) class Widget { public: Widget(){TRACE_FUCTION_AND_LINE();} void* operator new(size_t nSize) { void*p = malloc(sizeof(Widget)); TRACE_FUCTION_AND_LINE("malloc p=%08p", p); return p; } void operator delete(void* memory) { TRACE_FUCTION_AND_LINE("free p=%08p", memory); free(memory); } ~Widget(){TRACE_FUCTION_AND_LINE();} }; int main() { Widget *pWidget = new Widget(); TRACE_FUCTION_AND_LINE("begin to delete"); delete pWidget; return 0; }

2.割り当てられたメモリにオブジェクトを割り当てるにはplacement newを使用します。


次のコードmain関数では、まずスタックメモリbufを割り当て、memoryポインタに値を割り当てます.
次にnew(memory)Widget(100)を呼び出してmemoryポインタをoperator newメソッドに渡す.
operator newはメモリを割り当てるためで、今すでに1つのスタックメモリがあって、直接持ってきて使用することができて、だから直接return buffer;
次に、Widgetのコンストラクション関数を呼び出してオブジェクトを初期化します.ログを印刷した後、呼び出しオブジェクトの構造関数を実行する必要があります.
構造関数をアクティブに呼び出さないと、オブジェクトの構造関数は呼び出されません.
なぜdelete pwを呼び出してメモリを解放しないのかと聞かれるかもしれません.operator deleteのデフォルトではdelete方式のdeleteメモリが採用されているため、実際にdeleteの
スタックメモリmemory、すぐに問題が発生します.
main関数の下に注釈するコードは、new、operator new、mallocの3つのメモリ割り当てと解放方式に対する個人的な簡単なテストだけで、どの効率が高いかを見たいと思っています.
テスト例は不十分で、一般的なメモリ使用スキームの割り当てと解放はランダムであり、この例はそうではなく、現実データを正確に反映することはできないが、少なくともmallocがより速く見えることを示している.
#include <iostream>
#include <time.h>
using namespace std;


/*
new operator operator new Widget 
 operator new delete placement new
*/
#define TRACE_FUCTION_AND_LINE(fmt, ...) printf("[%20s:%4d]"fmt"
",__FUNCTION__, __LINE__, ##__VA_ARGS__) class Widget { public: Widget(int nHight = 0): m_nHight(nHight) {TRACE_FUCTION_AND_LINE();} void* operator new(size_t nSize, void* buffer) { TRACE_FUCTION_AND_LINE("malloc p=%08p", buffer); return buffer; } ~Widget(){TRACE_FUCTION_AND_LINE();} void Log () {TRACE_FUCTION_AND_LINE("My Log------%d", m_nHight);} int m_nHight; }; int main() { char buf[sizeof(Widget)]; // void* memory = buf;// widget , TRACE_FUCTION_AND_LINE("memory = %08p", memory); Widget* pw = new (memory)Widget(100); //placement new memory operator new pw->Log(); pw->~Widget();// /* double start, end; while(1) { start = clock(); for(int i = 0; i < 500; ++i) { for(int j = 0; j < 10000; ++j) { void* pMemory = operator new(10000); operator delete(pMemory); } } end = clock(); TRACE_FUCTION_AND_LINE("operator new takes %.2f seconds", (end-start) / CLOCKS_PER_SEC); start = clock(); for(int i = 0; i < 500; ++i) { for(int j = 0; j < 10000; ++j) { void* pMemory = new char[10000]; delete [](pMemory); } } end = clock(); TRACE_FUCTION_AND_LINE("new char takes %.2f seconds", (end-start) / CLOCKS_PER_SEC); start = clock(); for(int i = 0; i < 500; ++i) { for(int j = 0; j < 10000; ++j) { void* pMemory = malloc(10000); free(pMemory); } } end = clock(); TRACE_FUCTION_AND_LINE("malloc takes %.2f seconds", (end-start) / CLOCKS_PER_SEC); TRACE_FUCTION_AND_LINE("


"); } */ return 0; }