代码之家  ›  专栏  ›  技术社区  ›  letsc

内存分配

c++
  •  2
  • letsc  · 技术社区  · 15 年前

    当我们在一个函数(这里不是main)中“定义”一个变量时,内存分配是在运行时完成的还是加载程序为我们服务的??

    如果我有:

    int f()
    {
         int a=10;
    
         ........
    }
    
    main()
    {
         int i;
         scanf("%d",&i);
         while(--i)
             f();
          ..........
    }
    

    6 回复  |  直到 15 年前
        1
  •  11
  •   Henk Holterman    15 年前

    a 每次呼叫 f() . 这是设置“堆栈框架”的一部分 f() 而且在时间上(几乎)什么都不花。它会占用一点堆栈空间,但不会超过 int .

    期间 while(--i) f(); 函数 f() 称这种动态分配为堆栈、本地或自动分配。

        2
  •  1
  •   Eldad Mor    15 年前

    这是一个堆栈分配,意味着在堆栈上为整数保留一个位置—它的分配方式与“在堆上找到4个空闲字节并为我分配它们”不同。

        3
  •  1
  •   liaK    15 年前

    i 中的次数 Stack ..

    问题2。不。。使用分配的内存 new 关键字是动态内存分配,它将在堆中分配,在您提供的示例中进行的分配是堆栈分配。。

        4
  •  0
  •   Alexander Rafferty    15 年前

    变量是在堆栈上分配的,不是“动态内存”。是的,a将被放在堆栈上i次。

        5
  •  0
  •   Donotalo    15 年前

    f() 被称为, a known as stack pointer ). 由于堆栈指针的增量/减量是由编译器(通过在二进制文件上写入指令)完成的,因此它不是动态分配。函数返回后,空间将自动恢复。这也可以通过改变堆栈指针的值来实现,编译器在二进制文件上编写必要的指令来实现。

    Dynamic memory allocation 指编译器没有为您保留内存的进程。相反,空间是由操作系统在运行时分配的。空间来自RAM的堆区域。程序员负责释放空间,而编译器不会对此做任何事情。当动态内存分配编码为 new

    int *prt = new int[10];
    

    编译器没有为10个整数保留内存。相反,会向操作系统发出保留该内存的请求。执行此代码时,操作系统保留内存(如果有足够的内存可用),并返回指向内存开头的指针。

        6
  •  0
  •   Vintharas    15 年前

    通常,在函数中定义变量时,内存分配是在运行时完成的,变量存储在堆栈中,堆栈表示这类变量(局部变量)的存储系统。

    对。在您提供的示例中,变量a按照以下过程创建“i”次:

    While Loop
       Function f()
          Push variable a into stack
          Function f logic
          Pull variable a from stack
       End Function f()
    End While
    

    因此,局部变量(函数或块中的变量)的一般行为是,在其作用域(函数或块)内的声明被推入堆栈时分配,在作用域结束时(函数或块的结尾)被从堆栈中拉出来时被“释放”。

    这不是动态分配,而是自动分配。只能使用 新的 删除 以释放它。

    有关更多信息,请参阅 C++入门+第9章。内存模型和名称空间