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
C++ 工作线程中自动变量的重新分配_C++_C_Multithreading_Memory Management - Fatal编程技术网

C++ 工作线程中自动变量的重新分配

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) {

在下面的代码片段中,自动变量x和y在while循环的每个过程中都会重新分配到堆栈上,并且永远不会释放,最终导致堆栈溢出,这是对的吗?在从内部while循环的范围内激发后释放之前,每个过程中是否还会有10个z的重新分配

如果此代码段被放置在工作线程中,那么在线程完成其时间分配后,堆栈是否会被保存以供重新输入,即x和y是否永远不会被释放

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>