Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/136.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ QThread中的堆栈大小_C++_Qt_Stack_Qthread - Fatal编程技术网

C++ QThread中的堆栈大小

C++ QThread中的堆栈大小,c++,qt,stack,qthread,C++,Qt,Stack,Qthread,在QT5和C++中使用QThread时,最大默认堆栈大小是多少?我的线程中有一个QVector,我正在调用myvector.append()方法,我感兴趣的是我的向量有多大。我找到了uint QThread::stackSize()const方法,该方法返回堆栈大小,但前提是它以前是由方法setStackSize()更改的,但默认堆栈大小是多少 QThread堆栈大小可以通过以下两个调用读取和设置: uint QThread::stackSize() const void QThread::

QT5C++中使用QThread时,最大默认堆栈大小是多少?我的线程中有一个QVector,我正在调用
myvector.append()
方法,我感兴趣的是我的向量有多大。我找到了
uint QThread::stackSize()const
方法,该方法返回堆栈大小,但前提是它以前是由方法
setStackSize()
更改的,但默认堆栈大小是多少

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);
     ...
}
void QVector::append(常量T&T)
{
...
如果(!isDetached()| | IsToSmall){
...
reallocData(d->size,iStosmall?d->size+1:d->alloc,opt);
...
}

它所做的一切就是在堆中分配新的空间(预先分配预定义的元素计数),并确保数据存储在连续的内存空间中。看起来它并不关心页面边界等问题。

QThread stack size可以通过以下两个调用读取和设置:

 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);
     ...
}
void QVector::append(常量T&T)
{
...
如果(!isDetached()| | IsToSmall){
...
reallocData(d->size,iStosmall?d->size+1:d->alloc,opt);
...
}

它所做的一切都是在堆中分配新空间(预先分配预定义的元素计数)并确保数据存储在连续的内存空间中。看起来它与页面边界等无关。

只有在编译32位应用程序并且在堆栈上显式为缓冲区分配存储时,堆栈大小才起作用。只需使用自动
QVector
std::vector
实例即可e不会在堆栈上分配任何大的缓冲区—您需要为此使用自定义分配器


IIRC在64位应用程序中,内存的布局使您永远不会为任何合理数量的线程耗尽堆栈空间。

只有在编译32位应用程序并且在堆栈上显式分配缓冲区存储时,堆栈大小才起作用。只需使用自动
QVector
std::vector
实例不会在堆栈上分配任何大的缓冲区-您需要为此使用自定义分配器


IIRC在64位应用程序中,内存的布局应确保不会为任何合理数量的线程耗尽堆栈空间。

向量的内部应该在“堆”上,因此基本上可以在系统ram中创建最大的单个块。向量的内部应该在“堆”上因此,您基本上有一个可以在系统ram中创建的最大单个块的限制。您可以开发64位应用程序上的断言吗?+“合理的线程数”,这对您意味着什么。ThanksReasonable表示的顺序与逻辑核的数量相同。64位应用程序通常有48位虚拟内存空间,此时在大多数合理的计算机上,堆栈可能大于RAM大小。您能否开发或认可您在64位应用程序上的断言?+“合理的线程数”,这对你意味着什么。ThanksReasonable意味着与逻辑核数的顺序相同。64位应用程序通常有48位虚拟内存空间,此时在大多数合理的机器上,堆栈可能大于RAM大小。