[C++] Pourquoi Clang optimise-t-il x * 1.0 mais PAS x + 0.0?


Answers

x += 0.0 n'est pas un NOOP si x est -0.0 . L'optimiseur pourrait quand même éliminer toute la boucle car les résultats ne sont pas utilisés. En général, il est difficile de dire pourquoi un optimiseur prend les décisions qu'il prend.

Question

Pourquoi Clang optimise la boucle dans ce code

#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);
}

mais pas la boucle dans ce code?

#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);
}

(Marquage comme C et C ++ parce que je voudrais savoir si la réponse est différente pour chacun.)