引入
C++
语言不支持栈Stack
(此处出现的堆栈为操作系统的堆栈) 上的可变长度数组:
1 | int fun1(unsigned n) |
还有一种办法则是在堆Heap
上构建:
1 | int fun2(unsigned n) |
众所周知,Qt
实现多线程的方式有两种,一种是通过子类化QObject
并将该类实例化后调用QObject::moveToThread
,将对象的所有函数执行放到另一个线程当中;另一种则是通过子类化QThread
后重写run
内的内容。当然,QtConcurrent::run
不算在此内。
在第一种
方法中,我们可以很容易得到槽函数
会在moveToThread
的那个线程中执行。再这,我们着重讨论第二种办法。
通常,我们对QThread
子类化后,会将需要执行的内容放在run
函数中。Qt
也告诉我们:**QThread
实例位于实例化它的旧线程中,而不是位于调用run()的新线程中。这意味着QThread
的所有队列槽函数和调用的方法都将在旧线程中执行。因此,希望在新线程中调用槽的开发人员必须使用worker对象方法;新的槽函数不应该直接实现到子类QThread中。**
在使用QString
,QByteArray
等容器时,都会碰到一个名词隐式数据共享
。说起来比较高大上,通俗一点就是写时复制(copy-on-write)
,当两个对象共享同一份数据时通过浅拷贝实现数据块的共享,如果数据不改变,不进行数据的复制。而当某个对象需要改变数据时则执行深拷贝。
此处验证QString
的隐式数据共享:
1 | ... |