Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/128.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 我可以使用C++;使用Q定时器和信号优化对象创建?_C++_Qt_Optimization - Fatal编程技术网

C++ 我可以使用C++;使用Q定时器和信号优化对象创建?

C++ 我可以使用C++;使用Q定时器和信号优化对象创建?,c++,qt,optimization,C++,Qt,Optimization,我想实现这一点:使用一个特定的对象,它将被创建多次,并且需要尽可能快。然而,在我的对象中,我有一个带有连接插槽的qtimer,它在构造函数之后才启动 我的问题是,这种方法是否仍然适用于QTimer()及其各自的信号和插槽?还是仅限于不实例化其他对象的对象 这是一个优化示例: template <int def,int real> struct check_d_size : ::static_assert::is_fail<(bool)(def == real)> {};

我想实现这一点:使用一个特定的对象,它将被创建多次,并且需要尽可能快。然而,在我的对象中,我有一个带有连接插槽的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
是您的私有类,则它的分配会更快,类的ctor中的QTimer内容的分配将保持不变,除非您也在堆栈上分配QTimer,也就是说,
QTimer m_AutoJoinTimer
而不是
QTimer*m_AutoJoinTimer

我看不到StackObj和PenPathDetails::PenPathDetails之间的关系。还是我遗漏了什么?顺便说一句,谢谢你的链接。非常有趣…Koying,现在没有关系,我想让PenPathDetails使用与StackObj相同的创建方法。
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();
}