我可以使用带有QTimer和信号的C++对象创建优化吗
Can I use a C++ object creation optimisation with QTimers and signals?
我想实现这个: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
相关文章:
- 什么时候调用组成单元对象的析构函数
- 对RValue对象调用的LValue ref限定成员函数
- CMake-按正确顺序将项目与C运行时对象文件链接
- 空基优化子对象的地址
- 将对象数组的引用传递给函数
- 你能重载对象变量名本身返回的内容吗
- C++使用整数的压缩数组初始化对象
- 找不到成员对象:没有名为get_event()的成员,也处理多态性和向量
- 将对象移动到std::shared_ptr
- 代理对象的常量正确性
- 提升 ASIO 无法识别计时器对象
- 将Ref对象作为类成员
- 将包含C样式数组的对象初始化为成员变量(C++)
- 如何返回一个类的两个对象相加的结果
- 使用std::函数映射对象方法
- 是否需要删除包含对象的"pair"?
- 如何在自删除后将对象设置为nullptr
- 迭代时从向量和内存中删除对象
- 构造对象的歧义
- 使用"std::unordereded_map"映射到"std::list"对象