Published on

Comprendre le principe et inline et static

 8 mins
Authors
  • avatar
    Name
    Léo Delpon
    Twitter

Prérequis:

  • Avoir de bonnes connaissances en C, c'est-à-dire connaître la notion des variables, des fonctions, des types de données et des opérateurs
  • Connaître la notion de portée et de durée de vie des variables
  • Connaître les notions de compilations et de lien

Principe du terme static

Le terme static en C signifie que la fonction qui est déclarée va être limité à l'unité de compilation à laquelle est elle déclarée. Cela signifie plus simplement que si une fonction est déclarée en tant que static dans un fichier .c quelconque, elle ne sera visible que dans ce dernier.

Un peu d'explication par l'image si vous le voulez bien

Imaginons que votre programme en C soit une grande entreprise avec plusieurs départements (fichiers source). Chaque département a ses propres ressources et règles. Lorsqu'une variable ou fonction est déclarée comme static dans un fichier source (département), cela signifie qu'elle ne peut être utilisée que dans ce département spécifique. C'est comme avoir une machine ou un outil spécialisé dans un département que les autres départements ne peuvent ni voir ni utiliser. Cela aide à prévenir les "interférences" ou les conflits entre les départements (fichiers), car une machine similaire dans un autre département n'affectera pas celle-ci.

Exemple d'utilisation

// File calculator.c

static int substract_number(int a, int b) {
  return a - b;
}

Dans ce cas, la portée de cette fonction se limitera seulement au fichier calculator.c. Cependant, il est totalement possible d'utiliser static pour une variable !

// File calculator.c 

static int result;

void substract_number(int a, int b) {
  result = a - b;
}

void add_number(int a, int b) {
  result = a + b;
}

Dans ce cas, la variable result a une portée limitée au fichier calculator.c. Mais ce n'est pas tout, d'un point de vue performance, la variable result a une durée de vie étendue, ce qui signifie que elle n'est alloué qu'une seule fois et conserve sa valeur entre les différents appels de fonction. Cela peut permettre à une amélioration de la performance car cela évite d'allouer et de désallouer fréquemment de la mémoire.

D'autres avantages liés à la notion de static

La prévention des conflits de noms

Dans de grands projets avec de multiples fichiers source, il peut y avoir des variables ou des fonctions avec les mêmes noms dans différents fichiers. L'utilisation de static garantit que chaque fichier peut avoir ses propres variables ou fonctions avec des noms identiques sans provoquer de conflits, car elles sont locales à chaque fichier.

La réutilisation du code

Les fonctions static sont généralement utilisées pour encapsuler des fonctionnalités spécifiques à un fichier source. Cela permet de réutiliser le code dans d'autres parties du même fichier sans avoir à le dupliquer, favorisant ainsi la modularité et la réutilisation du code.

Principe du terme inline

Le terme inline va suggérer au compilateur une chose assez intéressante. Il va lui proposer de remplacer l'appel de fonction par son corps directement. Cela permet entre autre de réduire l'overhead (temps supplémentaire) lié à l'appel de fonction.

Si ce n'est pas clair

Pour inline, utilisons l'analogie d'un conseil rapide et fréquemment donné. Imaginez un conseil ou une astuce que vous donnez souvent à vos collègues. Au lieu de les faire venir à chaque fois pour le même conseil, vous écrivez ce conseil sur un post-it et le collez sur leur bureau. Ainsi, chaque fois qu'ils en ont besoin, ils peuvent simplement le lire sur le post-it, économisant le temps et l'effort de venir vous voir.

Exemple d'utilisation


inline int max(int a, int b) {
    return a > b ? a : b;
}

Rentrons sur quelque chose d'un peu plus technique

A présent,

Les avantages à utiliser inline

Réducation de la surcharge

Lorsque vous avez de nombreuses petites fonctions utilitaires qui sont fréquemment appelées, les appeler en tant que fonctions inline peut réduire la surcharge du code générée par les appels de fonction. Cela peut conduire à un code exécutable plus efficace.

Contrôle sur l'inlining

En utilisant inline, vous pouvez suggérer au compilateur quelles fonctions doivent être en ligne, mais le compilateur peut choisir de suivre cette suggestion ou non. Cela vous donne un certain contrôle sur l'optimisation du code sans devoir écrire le code en ligne manuellement.

Eviter les macros

Ceci va plaire à ceux qui écrivent des macros mais ont du mal à les débuger. Dans de nombreux cas, inline peut être utilisé comme une alternative plus sécurisée et lisible aux macros. Les macros peuvent être sujettes à des erreurs et sont plus difficiles à déboguer, tandis que les fonctions inline sont plus robustes et offrent des avantages en termes de maintenance.

Compatibilité avec les en-têtes

Contrairement aux macros, les fonctions inline peuvent être définies dans des fichiers d'en-tête sans risque de duplication de code. Cela facilite l'utilisation de fonctions inline dans des bibliothèques partagées.