【问题标题】:Code won't execute unless cout is used除非使用 cout,否则代码不会执行
【发布时间】:2015-05-26 16:05:40
【问题描述】:

我编写了一个非常简单的程序来查看在内存中分配许多对象时它的行为。 它运行良好,只要有足够的时间就会消耗我所有的计算机内存,除非删除 cout 语句。如果没有该行,程序将在初始化后立即退出。为什么?

代码:

#include <iostream>

class Test
{
    long long test1[10];
    long long test2[10];
    long long test3[10];
    long long test4[10];
    long long test5[10];
};

int main()
{
    for (int i = 0; i <= 500000; ++i)
    {
        new Test;
        new Test;
        new Test;
        new Test;

        std::cout << i << "\n"; // Program won't work as desired without this
    }
    return 0;
}

设置:Visual Studio 2013,发布,x64,静态 Crt

编辑:我在工作的时候匆忙发布了这个问题,很抱歉粗心。现在是正确的。

【问题讨论】:

  • 在没有std::cout 声明的情况下,您如何确定该程序“运行良好”?你观察到了什么?
  • 它运行得很好,直到内存不足 - goo.gl/oEd4uy
  • @DrewDormann 实际上它运行良好 with cout。我编辑了问题,请看一下。谢谢
  • @IlyaKobelevskiy 不错的工具!好吧,我也在那里检查过。尝试评论第 25 行,你会明白我指的是什么。

标签: c++ compilation console-application compiler-optimization


【解决方案1】:

如果没有 std::cout 行和with 优化打开,您的编译器会确定有一个更快的算法,它相当于你写的逻辑。

更快的算法是“什么都不做”


注意:这是可能的,因为您的编译器假设“内存不足”的情况不是预期的副作用。因此,更快的算法是有效的,即使它降低了内存不足的可能性。

【讨论】:

  • 您能否评论一下可以采取哪些措施来防止我的“所需操作”被优化,而实际上不必完全关闭优化?
  • 如果你不关闭优化,那么......它们不会被关闭!你的评论没有意义。
  • @kebs 你误会我了。我希望我的程序无休止地分配内存(只是代码示例 - 使用 cout 行),而不关闭整个程序的优化。
  • 你需要告诉编译器做一些他无法优化的事情。一种解决方案是将变量声明为register,然后在for 循环中为其赋值。见en.cppreference.com/w/c/language/storage_duration。但是,我不能保证它会起作用,因为编译器似乎仍然可以优化它。我知道还有另一种方法,但就是想不起来了……
  • @Marc.2377 如果您ask it as a new question,您在这些 cmets 中的问题可能会得到更多关注。如果您采取这条路线,请务必解释为什么您需要全面优化,因为这是棘手的部分。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-04-24
  • 1970-01-01
  • 1970-01-01
  • 2014-09-17
  • 1970-01-01
  • 1970-01-01
  • 2016-04-13
相关资源
最近更新 更多