为什么Clang优化x * 1.0而不是x + 0.0?

时间:2015-10-22 03:38:40

标签: c++ c optimization floating-point clang

为什么Clang会优化此代码中的循环

#include <time.h>
#include <stdio.h>

static size_t const N = 1 << 27;
static double arr[N] = { /* initialize to zero */ };

int main()
{
    clock_t const start = clock();
    for (int i = 0; i < N; ++i) { arr[i] *= 1.0; }
    printf("%u ms\n", (unsigned)(clock() - start) * 1000 / CLOCKS_PER_SEC);
}

但不是此代码中的循环?

#include <time.h>
#include <stdio.h>

static size_t const N = 1 << 27;
static double arr[N] = { /* initialize to zero */ };

int main()
{
    clock_t const start = clock();
    for (int i = 0; i < N; ++i) { arr[i] += 0.0; }
    printf("%u ms\n", (unsigned)(clock() - start) * 1000 / CLOCKS_PER_SEC);
}

(标记为C和C ++,因为我想知道每个答案是否不同。)

1 个答案:

答案 0 :(得分:35)

如果x += 0.0-0.0,则

x不是NOOP。尽管如此,优化器仍然可以去除整个循环,因为结果没有被使用。一般来说,很难说出为什么优化器会做出决策。