QThread 中的堆栈大小
Posted
技术标签:
【中文标题】QThread 中的堆栈大小【英文标题】:Stack size in QThread 【发布时间】:2016-07-19 12:34:45 【问题描述】:在 QT5 和 C++ 中使用 QThread 时最大的默认堆栈大小是多少?我的线程中有一个 QVector,我正在调用 myvector.append()
方法,我很感兴趣我的向量可以有多大。我发现uint QThread::stackSize() const
方法返回堆栈大小,但前提是它之前被方法setStackSize()
更改过,但默认堆栈大小是多少?
【问题讨论】:
向量的内部结构应该在“堆”上,所以你基本上可以在系统内存中创建最大的单个块。 【参考方案1】:QThread 堆栈大小可以通过这两个调用来读取和设置:
uint QThread::stackSize() const
void QThread::setStackSize(uint stackSize)
如果 Qthread 在不同操作系统中以操作系统特定线程为十年,在 linux 中 pthread 最大堆栈大小为 8M。
但听起来你担心 QVector 在堆栈中增长,这并没有发生。 QVector 将数据存储在堆中。
来自QVector的源代码,
void QVector<T>::append(const T &t)
...
if (!isDetached() || isTooSmall)
...
reallocData(d->size, isTooSmall ? d->size + 1 : d->alloc, opt);
...
它所做的一切都是在 HEAP 中分配新空间(预先分配预定义的元素数量)并确保数据存储在连续的内存空间中。看起来不关心页面边界等。
【讨论】:
【参考方案2】:只有在编译 32 位应用程序时,堆栈大小才起作用并且您在堆栈上显式地为缓冲区分配存储空间。仅使用自动 QVector
或 std::vector
实例不会在堆栈上分配任何大缓冲区 - 您需要为此使用自定义分配器。
IIRC 在 64 位应用程序中,内存的布局使得您永远不会用完任何合理数量的线程的堆栈空间。
【讨论】:
您能否就您在 64 位应用程序上的断言进行开发或评价? + "合理数量的线程" ,这对您意味着什么。谢谢 合理的意思是与逻辑核的数量在同一顺序。 64 位应用程序通常具有 48 位虚拟内存空间,此时堆栈可能大于大多数合理机器上的 RAM 大小。以上是关于QThread 中的堆栈大小的主要内容,如果未能解决你的问题,请参考以下文章