C++ 这是什么意思;堆栈上分配的所有内存在编译时都是已知的;?

C++ 这是什么意思;堆栈上分配的所有内存在编译时都是已知的;?,c++,compilation,stack,allocation,C++,Compilation,Stack,Allocation,在阅读有关堆栈与堆的文章时,我对这个短语有一个疑问:堆栈上分配的所有内存在编译时都是已知的 我的意思是,如果我在一个依赖于用户输入的for周期内(I从0到X),并且在for中我在堆栈上分配内存(比如创建一些类的新实例并放入类容器),它就不知道编译程序时堆栈将如何增长(它会错过用户的输入) 我误解了什么吗?在考虑的情况下,堆栈意味着编译器为方法中定义的局部变量分配的内存。定义变量时,“您分配”(在引号中,因为它是为您完成的)此内存,如: void myMethod(int x) { int

在阅读有关堆栈与堆的文章时,我对这个短语有一个疑问:堆栈上分配的所有内存在编译时都是已知的

我的意思是,如果我在一个依赖于用户输入的
for
周期内(
I
从0到X),并且在
for
中我在堆栈上分配内存(比如创建一些类的新实例并放入类容器),它就不知道编译程序时堆栈将如何增长(它会错过用户的输入)


我误解了什么吗?

在考虑的情况下,堆栈意味着编译器为方法中定义的局部变量分配的内存。定义变量时,“您分配”(在引号中,因为它是为您完成的)此内存,如:

void myMethod(int x)
{
    int y;
    for (y = 0; y < 10; y++)
    {
       int z = x + y;
    }
}
现在
p
是本地变量(存储在堆栈中),它存储在堆中为10个整数数组分配的内存地址

当编译器解析您的源代码时,它会生成一组用于调用您的方法的指令(根据特定处理器),在这段时间内,它会计算所有局部变量所需的内存大小,在程序执行时,内存将分配到堆栈中在方法开始之前(方法完成后,所有内存将被释放,即堆栈将被释放,方法执行期间使用的数据“将丢失”)

我的意思是,如果我在一个依赖于用户输入的for循环内(I从0到X),并且在for循环内,我在堆栈上分配内存(例如创建一些类的新实例并放入类容器中),它就不知道编译程序时堆栈将如何增长(它错过了用户的输入)

所以你有一个类容器

std::vector< SomeClass > vec;
    vec.push_back( x );
}
…该容器将实例存储在堆上

堆栈上只有一个
SomeClass
,这一事实在编译时就已经知道了。堆栈不会超过这一个实例


不过,有一些方法可以在运行时增加堆栈(例如
alloca()
),因此本教程中的一般语句并不完全正确。

对于读者来说,该语句稍微简化了一点。堆栈本质上是动态的,实际分配的数量可能会随动态输入而变化。下面是一个简单的递归函数示例:

void f(int n)
{
    int x = n * 10;
    if(x == 0) return;

    std::cout << x << std::endl;
    f(n - 1);
}

int main()
{
    int n;
    std::cout << "Enter n: " << std::endl;
    std::cin >> n;
    f(n);
}
void f(int n)
{
int x=n*10;
如果(x==0)返回;

std::cout但是在每次迭代中,
SomeClass x
都会被创建。如果我的x=20,那么内存中会创建20个不同的类。不是吗?@paizza:每个实例在循环结束时都会被销毁(因为它超出了范围)。在第二次迭代中,您无法再从第一次迭代中访问
x
。您存储在容器中的是
x
的副本,它位于堆中。@paizza:还要注意,我只讨论了当前函数的堆栈框架。请查看Smeeheey的答案,以了解整个堆栈的正确说明内存使用率。现在确定是否
SomeClass x;
进入堆栈。它不等于
SomeClass x=new SomeClass
?它进入堆…@paizza:您必须写入
SomeClass*x=new SomeClass;
——您将有一个指向(堆上)实例的指针(在堆栈上)。指针将在循环结束时超出作用域,就像在循环中声明的任何其他堆栈对象一样;堆对象将保持不变。您应该为假设的场景添加代码。我认为@DevSolar做得对,但如果您提供所需的代码,则不那么模棱两可。因此,在编译时已知的是每个
堆栈帧
。但不是将有多少堆栈帧。你是这样说的吗?确切地说。特定堆栈帧内的变量的查找形式为
BP-x
,其中
BP
是表示该帧的“基指针”的寄存器(在编译时未知),并且
x
是相关变量的编译时常数(例如
BP-8
)。之所以有
-
符号,是因为堆栈向下增长,远离基指针
    vec.push_back( x );
}
void f(int n)
{
    int x = n * 10;
    if(x == 0) return;

    std::cout << x << std::endl;
    f(n - 1);
}

int main()
{
    int n;
    std::cout << "Enter n: " << std::endl;
    std::cin >> n;
    f(n);
}