2 votes

Les compilateurs optimisant le langage C (GCC) sont-ils capables de détecter des valeurs immuables pour un accès en lecture seule sans l'utilisation de 'const' ?

Mes recherches n'ont rien donné sur cette question... Il existe de nombreuses discussions sur la façon dont const peut être utile dans l'optimisation du compilateur en signalant l'accès en lecture seule d'une variable, mais je ne trouve pas de réponse à la question posée dans le titre. La question m'intéresse parce que je veux éviter de penser à l'utilisation de const pour l'optimisation si le compilateur peut le faire de toute façon.

Je suis conscient que même si le compilateur est capable de trouver des valeurs immuables et de les optimiser pour un accès en lecture seule, il y aura des cas où l'utilisation de la fonction const serait toujours utile. Je cherche simplement une réponse sur les capacités du compilateur en termes généraux - est-ce que l'optimiseur de GCC recherche les valeurs immuables sans l'utilisation de l'option const ?

5voto

Antti Haapala Points 11542

Mon GCC, avec -O3 compile le code suivant

#include <stdio.h>

static int count1 = 3;
int count2 = 3;
const int count3 = 3;

int main(void) {
    for (int i = 0; i < count; i++) {
        printf("Hello world\n");
    }

    for (int i = 0; i < count2; i++) {
        printf("Hello again\n");
    }

    for (int i = 0; i < count3; i++) {
        printf("Hello once more\n");
    }
}

à l'équivalent de

#include <stdio.h>

int count2 = 3;
const int count3 = 3;

int main(void) {
    puts("Hello world");
    puts("Hello world");
    puts("Hello world");

    for (int i = 0; i < count2; i++) {
        puts("Hello again");
    }

    puts("Hello once more");
    puts("Hello once more");
    puts("Hello once more");
}

Il est clair que la première boucle a été déroulée même sans const -qualifié count1 parce qu'il a lien interne .

count2 a une liaison externe, et il sera impossible pour le compilateur de prouver que certains autre que vous liez à cette unité de traduction ne modifierait pas la variable statique dans une fonction de constructeur avant que main était exécuté et l'optimisation serait désactivée.

count3 es const -qualifié. Le compilateur sait qu'aucune autre unité de traduction ne peut changer sa valeur non plus et la boucle sera déroulée, en dépit de count3 ayant un lien externe, et la même variable étant visible par d'autres unités de traduction.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X