Могу ли я использовать оптимизацию создания объектов C ++ с QTimers и сигналами? - PullRequest
1 голос
/ 07 марта 2012

Я хотел бы реализовать это: http://lynxline.com/stack-vs-heap-pimpl-performance/ с конкретным объектом, который будет создаваться много раз и должен быть максимально быстрым.Однако в моем объекте у меня есть QTimers с подключенными слотами, которые не запускаются до окончания конструктора.

Мой вопрос, будет ли этот метод работать с 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();
}

1 Ответ

2 голосов
/ 07 марта 2012

Оптимизация происходит, когда вы делаете выделение памяти вашего частного класса. Где бы вы ни разместили его, он будет быстрее из-за того, что он расположен в стеке, а не в куче.

Предполагая, что PenPathDetails является вашим закрытым классом, его распределение будет быстрее, распределение содержимого QTimer в ctor класса останется постоянным, если вы также не выделите свой QTimer в стеке, т.е. QTimer m_AutoJoinTimer вместо QTimer* m_AutoJoinTimer

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...