gcc komplexe konstante Faltung

Es scheint, dass gcc eine gewisse Einschränkung hinsichtlich der komplexen konstanten Faltung aufweist. Hier ist ein Beispiel:

static inline unsigned int DJBHash(const char *str)
{
   int i;
   unsigned int hash = 5381;

   for(i = 0; i < strlen(str); i++)
   {
      hash = ((hash << 5) + hash) + str[i];   
   }

   return hash;
}

int f(void)
{   
    return DJBHash("01234567890123456");
}

Bei Ausführung mit der Optimierungsstufe -O3 (gcc 4.8) wird die Schleife in DJBHash gut ausgeblendet und der Hash-Wert für diese Zeichenfolge während der Kompilierungszeit berechnet.

Wenn Sie die Zeichenfolge jedoch um ein Zeichen verlängernreturn DJBHash("012345678901234567"); es faltet es nicht mehr und erzeugt eine Schleife mit einem bedingten Sprungbefehl.

Ich möchte eine Literalzeichenfolge in beliebiger Länge in ihren Hashwert als Kompilierzeitkonstante falten.
Könnte das getan werden?

Klärung

Meine Frage betraf die ständigen Faltungsoptimierungen auf gcc (siehe Titel - bitteunterlassen Sie Löschengcc undCompiler Stichworte)
Viele Antworten hier versuchen, das Problem entweder mit Templates oder mit constexpr zu lösen. Es ist gut, diese Optionen zu kennen und sich dafür zu bedanken, dass Sie zum Wohle aller veröffentlicht wurden. Sie beantworten meine Frage jedoch nicht direkt.

In der Praxis arbeite ich an einem gcc-Port, damit ich bei Bedarf den gcc-Quellcode ändern und erstellen kann. Aber ich bin auf C beschränkt und möchte dieses Problem in diesem Umfang lösen.

Antworten auf die Frage(4)

Ihre Antwort auf die Frage