C++ 工作线程中自动变量的重新分配
在下面的代码片段中,自动变量x和y在while循环的每个过程中都会重新分配到堆栈上,并且永远不会释放,最终导致堆栈溢出,这是对的吗?在从内部while循环的范围内激发后释放之前,每个过程中是否还会有10个z的重新分配 如果此代码段被放置在工作线程中,那么在线程完成其时间分配后,堆栈是否会被保存以供重新输入,即x和y是否永远不会被释放C++ 工作线程中自动变量的重新分配,c++,c,multithreading,memory-management,C++,C,Multithreading,Memory Management,在下面的代码片段中,自动变量x和y在while循环的每个过程中都会重新分配到堆栈上,并且永远不会释放,最终导致堆栈溢出,这是对的吗?在从内部while循环的范围内激发后释放之前,每个过程中是否还会有10个z的重新分配 如果此代码段被放置在工作线程中,那么在线程完成其时间分配后,堆栈是否会被保存以供重新输入,即x和y是否永远不会被释放 while (1) { int x = 0; int *y = &x; while (x < 10) {
while (1)
{
int x = 0;
int *y = &x;
while (x < 10)
{
int z = 0;
++x;
}
}
最终导致堆栈溢出
不会。自动变量超出范围时会被清除。如果您愿意,您可以想象堆栈在每次迭代开始时增长,然后在每次迭代结束时收缩。在实践中是否会发生这样的事情是另一回事
如果此代码段被放置在工作线程中,那么在线程完成其时间分配后,堆栈是否会被保存以供重新输入,即x和y是否永远不会被释放
在一个正常运行的系统中,每个线程都有自己的堆栈,当该线程终止时,堆栈将被清除
最终导致堆栈溢出
不会。自动变量超出范围时会被清除。如果您愿意,您可以想象堆栈在每次迭代开始时增长,然后在每次迭代结束时收缩。在实践中是否会发生这样的事情是另一回事
如果此代码段被放置在工作线程中,那么在线程完成其时间分配后,堆栈是否会被保存以供重新输入,即x和y是否永远不会被释放
在一个正常运行的系统中,每个线程都有自己的堆栈,当该线程终止时,堆栈将被清除。不,没有问题。自动变量每次都可以轻松地重用相同的空间。请记住,自动变量的生命周期在块的末尾结束,因此它们的生命周期永远不会超过一次迭代
事实上,如果每次迭代都使用不同的内存位置,那么您将需要更多的代码来构造一些东西——您必须保留一个额外的计数器,并每次计算一个偏移量 不,没问题。自动变量每次都可以轻松地重用相同的空间。请记住,自动变量的生命周期在块的末尾结束,因此它们的生命周期永远不会超过一次迭代 事实上,如果每次迭代都使用不同的内存位置,那么您将需要更多的代码来构造一些东西——您必须保留一个额外的计数器,并每次计算一个偏移量 x、y和z的空间将在每个循环中重复使用。任何地方都没有动态分配或解除分配 通常,本地自动变量的空间将在函数入口的堆栈上分配,并在函数结束时释放。x、y和z的空间将在每个循环循环循环中重复使用。任何地方都没有动态分配或解除分配
通常,本地自动变量的空间将在函数入口的堆栈上分配,并在函数结束时释放。对于此类情况,您可以使用 gcc-g-c yourfile.c 然后使用 objdump-d-M intel-S yourfile.o: 让我们把x放在[ebp-0xc] …和y位于[ebp-0x8] x仍处于[ebp-0xc]
对于这种情况,您可以使用 gcc-g-c yourfile.c 然后使用 objdump-d-M intel-S yourfile.o: 让我们把x放在[ebp-0xc] …和y位于[ebp-0x8] x仍处于[ebp-0xc]
对于z,我看到了你的论点,因为我很清楚内部while循环的范围。但就目前而言,x和y不是总是在范围内,所以永远不会被清理掉吗?@EdKing:我想你误解了区块是什么。这是用大括号分隔的东西。该块是在一次迭代中输入和退出的。@EdKing忽略我之前的评论,我以为你是在问z。对于x和y,是的,当函数运行时它们在范围内,但是为什么需要在while循环的每次迭代中重新定位它们呢?对于z,我看到了你的论点,因为内部while循环的范围对我来说很清楚。但就目前而言,x和y不是总是在范围内,所以永远不会被清理掉吗?@EdKing:我想你误解了区块是什么。这是用大括号分隔的东西。该块是在一次迭代中输入和退出的。@EdKing忽略我之前的评论,我以为你是在问z。对于x和y,是的,当函数运行时它们在范围内,但是为什么需要在每次迭代时重新定位它们呢 环它们只是停留在那里,在函数退出时被清理。
00000000 <main>:
int main() {
0: 55 push ebp
1: 89 e5 mov ebp,esp
3: 83 ec 10 sub esp,0x10
while (1)
{
int x = 0;
6: c7 45 f4 00 00 00 00 mov DWORD PTR [ebp-0xc],0x0
int *y = &x;
d: 8d 45 f4 lea eax,[ebp-0xc]
10: 89 45 f8 mov DWORD PTR [ebp-0x8],eax
while (x < 10)
13: eb 10 jmp 25 <main+0x25>
{
int z = 0;
15: c7 45 fc 00 00 00 00 mov DWORD PTR [ebp-0x4],0x0
++x;
1c: 8b 45 f4 mov eax,DWORD PTR [ebp-0xc]
1f: 83 c0 01 add eax,0x1
22: 89 45 f4 mov DWORD PTR [ebp-0xc],eax
25: 8b 45 f4 mov eax,DWORD PTR [ebp-0xc]
28: 83 f8 09 cmp eax,0x9
2b: 7e e8 jle 15 <main+0x15>
2d: eb d7 jmp 6 <main+0x6>