gpt4 book ai didi

c++ - 我可以对 QTimers 和信号使用 C++ 对象创建优化吗?

转载 作者:行者123 更新时间:2023-11-30 04:29:09 24 4
gpt4 key购买 nike

我想实现这个: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();
}

最佳答案

优化发生在您为私有(private)类分配内存时。无论你在哪里分配它,它都会更快,因为它是在堆栈上而不是在堆上分配的。

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

关于c++ - 我可以对 QTimers 和信号使用 C++ 对象创建优化吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9603828/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com