Warum Klang optimieren Weg x * 1.0, aber NICHT x + 0.0?

Warum Klappern-Optimierung entfernt die Schleife in diesem 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);
}

aber nicht die Schleife in diesem 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);
}

(Tagging als C und C++, weil ich würde gerne wissen, ob die Antwort ist für jeden anders.)

  • Die Optimierungs-flags sind derzeit aktiv?
  • Ich habe gerade -O3 ich weiß nicht, wie zu überprüfen, was, der aktiviert wird, wenn.
  • Es wäre interessant zu sehen, was passiert, wenn Sie das add -ffast-math", um die Befehlszeile.
  • static double arr[N] ist nicht zulässig, C; const Variablen zählen nicht als Konstante Ausdrücke in dieser Sprache
  • clang 3.6.1 kompiliert es ganz gut für mich, obwohl.
  • vielleicht zu einem compiler-Fehler; gcc gibt einen Fehler, auch mit den Standard-Optionen
  • [Insert snarky Bemerkung über wie C ist nicht C++, auch wenn Sie bereits genannt es aus.]
  • oder compiler-Erweiterung. Der code sollte constexpr size_t N = 1 << 27; mit C++11.
  • Warum MSVS nicht optimieren entfernt +0?

InformationsquelleAutor Mehrdad | 2015-10-22
Schreibe einen Kommentar