首页 文章

在循环中分配原始数据类型的次数是多少?

提问于
浏览
0

这是一个例子:

while (i < 10)
    {
        int j = 1;
        string k = "hello.";
    }

j是原始数据类型,k是对象 . 根据Do built-in types have default constructors?

因此非类类型(包括基本类型,数组类型,引用类型,指针类型和枚举类型)没有构造函数 .

并根据Declaring Variables inside Loops, good practice or bad practice? (2 Parter)

在对象(例如std :: string)的情况下,必须在每次迭代时执行构造函数和析构函数 .

但是,variable declaration within the while loop C/C++说,

while(i--)
{
int i = 100; //每次输入循环时都会创建
一世 - ;
的printf( “%d ..”,i)的;
} //循环中的i在这里不断被破坏

我已经了解到,当调用函数时(例如操作系统的 main() ),所有局部变量都在函数的开头创建,并在函数结束时销毁 . 上面的while循环引用表示原始数据类型 i 在while循环块中声明时被创建,并在while循环块的末尾为每次迭代销毁 .

这是真的吗? #1 在while循环块中声明的原始数据类型是为while循环的每次迭代分配的吗? #2 我错误地假设while循环中的这些声明应该在函数的开头创建while循环块包含在?

我正在寻找一个详细的解释,不只是是或否 .

3 回答

  • 3

    逻辑上,是的,变量是在循环体的开始处为循环的每次迭代创建的,并在最后被销毁 .

    在你的第一个例子中,每次迭代都将调用 std::string 的构造函数(实际上是 std::basic_string<char> ,这是 std::string ),析构函数也是如此 . 类似地, j 正在创建并在每次迭代时设置为 1 .

    在第二个示例中, i 将以相同的原因打印值 99 .

    编译器确实有一些余地 . 如果他们能够检测到没有重复创建和销毁的效果,他们可以保持变量存活,并简单地为每次循环迭代重新初始化它 . 它们甚至可以完全消除变量(例如,只重复打印99,而不是创建变量) . 但是,这样的事情是不可靠的,程序无法测试是否发生 .

  • 3

    程序的行为必须像每次循环时重新分配(然后解除分配)一样 .

    程序展示该行为完全取决于编译器的机制 . 在许多情况下,根本不会为变量分配任何空间,或者甚至根本不存在空间! (例如你的第一个例子中的 j

    如果空间确实被分配,我认为它必然是专门保留的)

  • 1

    是的,当你在循环中声明一个变量时,程序就像在每次循环迭代中创建和销毁变量一样 . 因此,如果变量具有类类型,则程序的行为就像每次调用其构造函数和析构函数一样 .

    但是,由于优化,可以消除不可观察的行为,因此第一个循环可以完全优化掉,第二个循环可以优化到类似的东西

    while(i--)
        printf("%d..", 99);
    

    因此可能会发生没有创建实际变量的情况 .

相关问题