我可以使用带有QTimer和信号的C++对象创建优化吗

Can I use a C++ object creation optimisation with QTimers and signals?

本文关键字:C++ 对象 创建 优化 信号 可以使 QTimer 我可以      更新时间:2023-10-16

我想实现这个:http://lynxline.com/stack-vs-heap-pimpl-performance/具有将被创建多次并且需要尽可能快的特定对象。然而,在我的对象中,我有带有连接槽的QTimer,它们直到构造函数之后才启动。

我的问题是,这种方法仍然适用于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();
}

当您对私有类进行内存分配时,会进行优化。无论您在哪里分配它,它都会更快,因为它是在堆栈上而不是在堆上分配的。

假设PenPathDetails是你的私有类,它的分配会更快,除非你在堆栈上也分配了QTimer,否则类的ctor中QTimer的分配将保持不变,即QTimer m_AutoJoinTimer而不是QTimer* m_AutoJoinTimer