2012-03-07 9 views
1

私はこれを実装したいと思います:http://lynxline.com/stack-vs-heap-pimpl-performance/何度も作成され、可能な限り速くなる必要のある特定のオブジェクトを持っています。しかし、私のオブジェクトでは、QTimersに接続されたスロットがあり、コンストラクターの後で始まるまでは起動しません。QTimersとシグナルでC++オブジェクト作成の最適化を使用できますか?

質問このメソッドは、QTimer()とそれぞれの信号とスロットで動作しますか?それとも、他人をインスタンス化しないオブジェクトに限定されていますか?

これは、最適化の例である:

template <int def,int real> 
struct check_d_size : ::static_assert::is_fail<(bool)(def == real)> {}; 

class StackObj { 
public: 
    StackObj() { 
     check_d_size<d_size,sizeof(Private)>(); 
     d = new(d_bytes) Private; 
    } 
    virtual ~StackObj() { d->~Private(); } 

private: 
    class Private { 
    public: 
     inline void * operator new(size_t, quint8 * mem) { return mem; } 

     int i; 
     int j; 
     DynObj * p; 
     std::string str; 

     class Check { 
     public: Check() { static bool b=true; if (b) { qDebug() << "ok new stack"; b = !b; } } 
       ~Check() { static bool b=true; if (b) { qDebug() << "ok del stack"; b = !b; } } 
     } chk; 
    }; 
    Private * d; 
    static const int d_size = 32; 
    quint8 d_bytes[d_size]; 
}; 

これは私のコンストラクタです:

PenPathDetails::PenPathDetails(DiagramScene *parent, int penId) : 
    m_parent(parent), 
    m_penId(penId), 
    m_originalPenId(-1) 
{ 
    m_AutoJoinTimer = new QTimer(); 
    m_AutoJoinTimer->setSingleShot(true); 
    m_MouseLastMovedTimer = new QTimer(); 
    m_MouseLastMovedTimer->setSingleShot(true); 

    connect(m_AutoJoinTimer, SIGNAL(timeout()), this, SLOT(slotGroupPaths())); 
    connect(m_MouseLastMovedTimer, SIGNAL(timeout()), this, SLOT(slotMouseReleased())); 

    reset(); 
    resetOriginalPenId(); 
} 
+0

StackObjとPenPathDetails :: PenPathDetailsの関係はありません。または私は何かを逃していますか? – Koying

+0

ご連絡ありがとうございました。非常に面白いです... – Koying

+0

Koying、今は関係がありません、私はPenPathDetailsをStackObjと同じ作成方法を使用したいと思っています。 –

答えて

2

あなたのプライベートクラスのメモリ割り当てを行う際に、最適化が起こります。 割り当てられている場所は、ヒープではなくスタックに割り当てられているため、処理が速くなります。

PenPathDetailsは、それがより速くなるでしょう。その割り当てあなたのプライベートクラスであると仮定すると、あなたがスタック上にあなたのQTimer年代を割り当てない限り、クラスのCTORでQTimerのものの割り当てが、あまりにも、すなわちQTimer m_AutoJoinTimerではなく、一定のままになりますQTimer* m_AutoJoinTimer

関連する問題