循环中的自动变量和自动对象内存分配

时间:2019-03-28 11:56:09

标签: c++

谁能告诉我变量integer1分配和释放了多少次? 那class_object呢?两者都分配和取消分配了三遍是真的吗?

for(int i = 0; i < 3; i++){
    int integer1;
    Class1 class_object(some_parameter);
}

2 个答案:

答案 0 :(得分:3)

对于局部变量的分配和释放是特定于编译器的。局部变量的分配/取消分配意味着在堆栈上保留空间。 不过,大多数编译器会将变量的分配和释放移出循环,并每次都为变量重用相同的空间。

因此,将有一个分配,这意味着在循环之前更改堆栈指针,并有一个释放,这意味着在循环之后恢复堆栈指针。许多编译器将计算函数所需的最大空间,并在函数输入时仅分配一次。当编译器发现变量的生存期已结束或以后的代码无法再访问它时,也可以重用堆栈空间。因此,在这里谈论分配和解除分配是毫无意义的。

您是否对正在发生的建设性和解构性的数量更感兴趣?在那种情况下,Class1的构造函数被调用3次,析构函数也被调用3次。但是再次,编译器可以优化它,只要结果表现为“好像”调用了构造函数/析构函数即可。

PS:如果某个东西的地址从未被占用(或可以被优化掉),那么编译器甚至可能不会保留堆栈空间,而只会在整个生命周期中将变量保存在寄存器中。

答案 1 :(得分:1)

对于自动(本地堆栈)变量,编译器会在堆栈上保留一些空间。

在这种情况下(如果忽略优化),编译器将为integer1class_object保留空间,这些空间很可能会在每次循环迭代中重用。

对于基本数据类型,除了此以外,什么也没做,但对于类,编译器将在输入变量的范围时调用构造函数,并在变量超出范围时调用析构函数。

大多数可能的变量在每次循环迭代中都会获得相同的地址(但是从标准的角度来看,这不一定是正确的。)

术语allocation通常是指从操作系统请求一些堆内存或其他资源。关于这个定义,没有分配任何东西。

但是为自动变量分配一些堆栈空间(或寄存器)也可能称为allocation,大多数编译器将分配一次内存(通过将堆栈帧的值设置为进入例程时足够大的值。) >

摘要:
最后,完全取决于编译器。您只能保证在其范围内获得一个有效的对象