相关疑难解决方法(0)

将用作睡眠的空for循环优化掉吗?

我正在查看一些代码进行审核,并且遇到了繁忙的等待:

int loop = us*32;
int x;
for(x = 0;x<loop;x++)
{
    /*do nothing*/      
}
Run Code Online (Sandbox Code Playgroud)

我似乎记得读过这些空循环可以被优化掉.这是在这里发生的事情还是可以的?

c

8
推荐指数
4
解决办法
5931
查看次数

快速计算C程序中执行的指令数

有没有一种简单的方法可以在执行C程序时快速计算执行的指令数量(x86指令 - 每个指令的数量和数量)?

gcc version 4.7.1 (GCC)x86_64 GNU/Linux机器上使用.

c linux profile

7
推荐指数
2
解决办法
8124
查看次数

for循环被忽略(优化?)out

我使用for/while循环来实现代码中的延迟.延迟的持续时间在这里并不重要,尽管它足够大而值得注意.这是代码片段.

uint32_t i;

// Do something useful

for (i = 0; i < 50000000U; ++i)
{}

// Do something useful
Run Code Online (Sandbox Code Playgroud)

我观察到的问题是这个for循环不会被执行.它可能会被编译器忽略/优化.但是,如果我i通过volatile 限定循环计数器,则for循环似乎执行,我确实注意到执行中所需的延迟.

对于使用/不使用volatile关键字的编译器优化的理解,这种行为似乎有点违反直觉.

即使循环计数器得到优化并存储在处理器寄存器中,计数器是否仍然可以工作,也许延迟较小?(因为内存提取开销被废除了.)

我正在构建的平台是Xtensa处理器(由Tensilica提供),C编译器是由Tensilica提供的,Xtensa C/C++编译器以最高级别的优化运行.

我尝试使用gcc 4.4.7with -o3和ofast优化级别.在这种情况下,延迟似乎有效.

c timedelay delay compiler-optimization xtensa

6
推荐指数
1
解决办法
1081
查看次数

为什么具有多个嵌套循环的代码可以在GCC上立即完成,但是要永远使用VS?

long long r = 0;
long long k = 0;
for (; k < 9999999999999; k++) 
{
    for (long long i = 0; i < 9999999999999; i++) 
    {
        for (long long j = 0; j < 9999999999999; j++) 
        {
            r = (r + (i * j) % 100) % 47;
            if (r != 0) 
            {
                r++;
            }
        }
    }
 }
Run Code Online (Sandbox Code Playgroud)

此代码在i3Core上以0.000001壁秒执行,在i7Core boost::timer::auto_cpu_timer上检查.

但是对于visual studio 2010来说,它似乎在无限的时间里运行.

GCC或VS出了什么问题?GCC优化太多了吗?

c++ optimization gcc compiler-optimization visual-studio

5
推荐指数
1
解决办法
1234
查看次数

实现忙循环的最佳方法是什么?

实现繁忙循环的最佳方法是什么?如果我错了,请纠正我?

while (1); // obviously eats CPU. 
while (1) { sleep(100); } // Not sure if it is the correct way ?
Run Code Online (Sandbox Code Playgroud)

c linux

4
推荐指数
1
解决办法
5443
查看次数

如何防止busy-wait优化

我需要一个功能忙等待。

for(long int j=0; j<50000000; ++j)
  ;
Run Code Online (Sandbox Code Playgroud)

当我在发布模式下编译时,这会得到优化。除了在调试模式下编译之外,是否有某种方法可以导致它没有得到优化?我并不特别关心循环的实际数量,但它必须是一个明显的忙延迟。

compiler-optimization

3
推荐指数
1
解决办法
1222
查看次数

什么是繁忙的循环?

它可以是带或不带语句的循环吗?

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

要么

int i = 0;

while (1)
{
   i++;
}
Run Code Online (Sandbox Code Playgroud)

c++

2
推荐指数
2
解决办法
1万
查看次数

gcc -O2优化到错误的行为,这是一个错误吗?

我编写了一个非常简单的程序来测试gcc -O2选项,它会产生错误的行为.这是gcc的bug吗?

我的C程序:

#include <stdio.h>

int main(int argc, char **argv)
{
    unsigned long i = 0;
    while (1) {
        if (++i > 0x1fffffffUL) {
            printf("hello\n");
            i = 0;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

当我用-O1编译它时,一切都是正确的,我在每个循环中加1.但是当我用-O2编译它时,我被忽略,在每个循环中输出"hello".为什么-O2会导致这种错误行为?是gcc的明显错误吗?我的gcc版本对于cygwin是4.8.3,我尝试了一个新版本,它也有同样的问题.

用-O1编译,汇编代码是:

Disassembly of section .text:

    00000000 <_main>:
    #include <stdio.h>

    int main(int argc, char **argv)
    {
       0:   55                      push   %ebp
       1:   89 e5                   mov    %esp,%ebp
       3:   83 e4 f0                and    $0xfffffff0,%esp
       6:   83 ec 10                sub    $0x10,%esp
       9:   e8 00 00 00 00          call   e <_main+0xe>
       e:   b8 00 …
Run Code Online (Sandbox Code Playgroud)

c optimization gcc

1
推荐指数
2
解决办法
825
查看次数