Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/146.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/5/actionscript-3/6.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++ CreateThread的reserve和commit参数之间有什么区别?_C++_Winapi_Virtual Memory - Fatal编程技术网

C++ CreateThread的reserve和commit参数之间有什么区别?

C++ CreateThread的reserve和commit参数之间有什么区别?,c++,winapi,virtual-memory,C++,Winapi,Virtual Memory,保留参数和提交参数到CreateThreadWindows API函数之间有什么区别 我听不懂下面几行 reserve参数设置系统应为线程堆栈保留的地址空间量。默认值为1MB。 commit参数指定最初应提交到堆栈保留区域的物理存储量 这两行代码可以在本段中找到,本段解释了c中CreateThread函数的一个参数++ cbStackSize cbStackSize参数指定线程可以为自己的堆栈使用多少地址空间。每个线程都有自己的线程 堆栈当CreateProcess启动进程时,它在内部调用Cre

保留参数和提交参数到
CreateThread
Windows API函数之间有什么区别

我听不懂下面几行

reserve参数设置系统应为线程堆栈保留的地址空间量。默认值为1MB。 commit参数指定最初应提交到堆栈保留区域的物理存储量

这两行代码可以在本段中找到,本段解释了c中
CreateThread
函数的一个参数++

cbStackSize

cbStackSize
参数指定线程可以为自己的堆栈使用多少地址空间。每个线程都有自己的线程 堆栈当
CreateProcess
启动进程时,它在内部调用
CreateThread
来初始化进程的主线程。对于
cbStackSize
参数,
CreateProcess
使用存储在可执行文件中的值。您可以使用 链接器的
/STACK
开关:

/STACK:[保留][,提交]

reserveargument设置系统应为线程堆栈保留的地址空间量。默认值为1MB。 CommitterGument指定最初应提交到堆栈保留区域的物理存储量


保留区为线程的堆栈空间设置了上限。提交将在其上放置一个地板。因此,它开始消耗提交量的内存,并在到达reserve时停止消耗

每个进程都有一个地址空间。每个线程的堆栈都位于该空间的某个位置。创建tread时,操作系统分配大小为reserve的地址空间

但它并没有为所有这些空间分配任何实际内存。它只分配commit内存量


堆栈会随着时间的推移而增长,操作系统会向堆栈中添加更多页面,从而延长提交量。但它不能无限期地增长。它的大小不能超过储备

区别在于虚拟内存和物理内存之间的区别

在任何名副其实的操作系统中,包括Windows,指针都不会直接指定内存芯片上的位置。它们是进程特定虚拟内存空间中的位置,然后操作系统分配物理内存芯片的各个部分来存储进程实际存储所需内容的部分内容。当内存不足时,可能会将一些数据交换到磁盘

reserve是要为堆栈分配的连续虚拟内存块的大小。低于或高于该范围,其他东西将被存储,因此保留设置了堆栈可以增长多大的上限

幸运的是,虚拟内存通常很丰富。32位Windows上有2GB,如果链接到
/largeAddressware
标志,则为3GiB,如果编译为64位(
x64
),则为大量。唯一的例外是WinCE 5.0之前的版本,您只有32MiB。因此,除非您正在创建大量线程,否则您可以在这里慷慨大方,而且您应该慷慨大方,因为如果您没有足够的线程,进程将崩溃

提交是系统应为堆栈预先分配的物理内存大小。这使得系统立即在物理内存中获得一些空间,这是一种共享资源,可能很稀缺。它可能需要交换或放弃以前的内容才能获得它。当你超过它时,系统会以小的延迟为代价自动加扰一些。所以,如果你真的需要内存的话,增加这个值,你唯一能得到的就是一点加速。如果你不这样做,那就慢下来。所以你在这里应该保守一点


堆栈是放置局部变量的地方。如果您使用大的本地缓冲区,而且这通常是合理的,因为堆栈分配比堆分配快得多(通过
malloc
/
new
/任何使用
std::allocator
的方法),那么您需要保留足够的堆栈。如果你不知道,1MiB通常足够了。

你能重新表述这个问题吗,这样你就可以立即清楚地知道你在谈论哪个函数了。。。上面提到了“这两行你会在这段解释c++中createthread函数的一个参数的文章中找到它们”,这里的问题是可编辑的。我对问题进行了编辑,使其更加明显,并采用了正确的格式。如果您不喜欢,可以进一步编辑它。顺便说一下,Windows API中没有
createthread
函数,只有
createthread
。C和C++是区分大小写的。非常感谢你能举个例子:????