相关疑难解决方法(0)

哪个更快:while(1)或while(2)?

这是一位高级经理提出的面试问题.

哪个更快?

while(1) {
    // Some code
}
Run Code Online (Sandbox Code Playgroud)

要么

while(2) {
    //Some code
}
Run Code Online (Sandbox Code Playgroud)

我说两者都有相同的执行速度,因为里面的表达式while应该最终评估为truefalse.在这种情况下,两者都评估,true并且条件内没有额外的条件指令while.因此,两者都具有相同的执行速度,而我更喜欢(1).

但采访者自信地说:"检查你的基础知识.while(1)比快while(2)." (他没有测试我的信心)

这是真的?

另请参阅:"for(;;)"是否比"while(TRUE)"快?如果没有,为什么人们会使用它?

c performance while-loop

582
推荐指数
15
解决办法
9万
查看次数

在没有循环或条件的情况下打印1到1000

任务:打印数字从1到1000,不使用任何循环或条件语句.不要只写1000次printf()cout语句.

你会怎么用C或C++做到这一点?

c c++ printf

323
推荐指数
52
解决办法
25万
查看次数

我如何制作一个不会被优化掉的无限空循环?

C11 标准似乎暗示不应优化带有常量控制表达式的迭代语句。我从这个答案中得到了我的建议,它特别引用了标准草案中的第 6.8.5 节:

其控制表达式不是常量表达式的迭代语句......可能会被实现假定为终止。

在该答案中,它提到while(1) ;不应进行优化之类的循环。

那么……为什么 Clang/LLVM 优化了下面的循环(用 编译cc -O2 -std=c11 test.c -o test)?

#include <stdio.h>

static void die() {
    while(1)
        ;
}

int main() {
    printf("begin\n");
    die();
    printf("unreachable\n");
}
Run Code Online (Sandbox Code Playgroud)

在我的机器上,这会打印出begin,然后在非法指令ud2放置在 之后的陷阱die()上崩溃在 Godbolt 上,我们可以看到调用puts.

让 Clang 输出无限循环是一项非常困难的任务-O2- 虽然我可以反复测试一个volatile变量,但这涉及到我不想要的内存读取。如果我做这样的事情:

#include <stdio.h>

static void die() {
    while(1)
        ;
}

int main() {
    printf("begin\n");
    volatile int x …
Run Code Online (Sandbox Code Playgroud)

c clang compiler-optimization language-lawyer

141
推荐指数
6
解决办法
3万
查看次数

C++优化器重新排序对clock()的调用是否合法?

C++编程语言第4版,第225页读取:只要结果与简单执行顺序的结果相同,编译器就可以重新排序代码以提高性能.一些编译器,例如发布模式下的Visual C++,将重新排序此代码:

#include <time.h>
...
auto t0 = clock();
auto r  = veryLongComputation();
auto t1 = clock();

std::cout << r << "  time: " << t1-t0 << endl;
Run Code Online (Sandbox Code Playgroud)

进入这种形式:

auto t0 = clock();
auto t1 = clock();
auto r  = veryLongComputation();

std::cout << r << "  time: " << t1-t0 << endl;
Run Code Online (Sandbox Code Playgroud)

这保证了与原始代码不同的结果(零与大于零的时间报告).有关详细示例,请参阅我的其他问题 这种行为是否符合C++标准?

c++ optimization clock

69
推荐指数
3
解决办法
3741
查看次数

while的目的(1); C中的陈述

有什么用途while(1);?我知道while(1)(没有分号)无限循环,类似于自旋锁情况.但是我没看到哪里while(1);可以使用?

示例代码

if(!condition)
{ 
  while(1);
}
Run Code Online (Sandbox Code Playgroud)

注意:这不是do- while()或简单的情况while(1).

c while-loop

54
推荐指数
6
解决办法
4万
查看次数

为什么Clang会优化此代码?

代码的目的是找到32位浮点位模式的总数,它代表0到1之间的值.在我看来这应该可行,但由于某种原因,Clang的汇编输出基本上相当于return 0;.

我使用-std=c++1y -Wall -Wextra -pedantic -O2和编译了Clang 3.3和Clang 3.4.1-std=c++1y -Wall -Wextra -pedantic -O3

Clang 3.4使用-O2和-O3优化一切.

Clang 3.3仅使用-O3优化一切.

通过"优化一切",我的意思是这是程序的汇编输出:

main:                                   # @main
    xorl    %eax, %eax
    ret
Run Code Online (Sandbox Code Playgroud)
#include <limits>
#include <cstring>
#include <cstdint>

template <class TO, class FROM>
inline TO punning_cast(const FROM &input)
{
    TO out;
    std::memcpy(&out, &input, sizeof(TO));
    return out;
}

int main()
{
    uint32_t i = std::numeric_limits<uint32_t>::min();
    uint32_t count = 0;

    while (1)
    {
        float n = punning_cast<float>(i);
        if(n >= 0.0f && n <= 1.0f) …
Run Code Online (Sandbox Code Playgroud)

c++ clang compiler-optimization

51
推荐指数
1
解决办法
3618
查看次数

与 C 相比,C++ 中无限循环没有副作用的好处是未定义行为?

在 C++ 循环中为

for(;;) {}
Run Code Online (Sandbox Code Playgroud)

是未定义的行为,但它们不在 C(?) 中。

在 P2809R0上。平凡的无限循环不是未定义的行为,它表示这样做有充分的理由。有没有一些简单的例子可以清楚地说明这一点?

c c++ optimization loops undefined-behavior

43
推荐指数
2
解决办法
3611
查看次数

编译器是否允许消除无限循环?

可以优化编译器删除无限循环,这不会改变任何数据,如

while(1) 
  /* noop */;
Run Code Online (Sandbox Code Playgroud)

从分析编译器可以推导出的数据流图,这样的循环是"死代码"而没有任何副作用.

是否删除了C90/C99标准禁止的无限循环?

C90或C99标准是否允许编译器删除此类循环?

更新:"Microsoft C版本6.0基本上做了这个优化.",请参阅caf的链接.

label: goto label;
return 0;
Run Code Online (Sandbox Code Playgroud)

将转变为

return 0;
Run Code Online (Sandbox Code Playgroud)

c compiler-construction optimization standards infinite-loop

30
推荐指数
3
解决办法
5512
查看次数

这是无限递归UB吗?

在C++ 11中,作为一个没有副作用的无限循环,以下程序是UB:

int main() {
   while (true) {}
}
Run Code Online (Sandbox Code Playgroud)

UB也是以下吗?

void foo() {
   foo();
}

int main() {
   foo();
}
Run Code Online (Sandbox Code Playgroud)

两个计划的标准引文都是理想的.

c++ recursion undefined-behavior c++11

24
推荐指数
1
解决办法
1226
查看次数

24
推荐指数
2
解决办法
3000
查看次数