[gull] Subtilité de C n° 6 : Tableaux et pointeurs, presque pareils

Yves Martin ymartin59 at free.fr
Sat Aug 2 11:31:13 CEST 2008


On Wed, 2008-07-30 at 20:00 +0200, Marc Mongenet wrote:

> Pour le passage par registre, j'ai en revanche de sérieux doutes.
> D'abord, il peut y avoir plus d'arguments que de registres disponibles.
> Ensuite, les types long, float, double et long double peuvent être plus
> longs que le mot processeur (int).

À priori, le compilateur peut utiliser des registres pour tous les
paramètres qui y rentrent et la pile pour les autres...
Avec un sérieux avantage de performance pour les registres, d'où un
usage sans vergogne - quitte à compiler une fonction en faisant un
joyeux mélange de tout cela.

> Enfin, il est possible de passer les structures par valeur (c'est une des
> nouveautés d'ANSI C introduite dans les années 1980).

Dans ce cas, la structure est recopiée sur la pile d'appel et la
fonction utilise un pointeur sur cette copie, au lieu du pointeur
original.
J'avoue que c'est très pratique pour isoler l'accès au contenu d'un
objet qui ne devrait pas être modifié en dehors de son contexte - au
détriment des performances, mais tous les développeurs ne sont pas
forcément assez disciplinés pour éviter les bêtises.


La performance des registres sur la mémoire est notable. C'est un des
avantages des plateformes x86_64 qui disposent de plus de registres que
l'ancienne i586. Ainsi les calculs d'expressions et les appels de
fonction peuvent se faire plus efficacement - et pas simplement parce
que la taille d'un registre passe de 32 à 64 bits - ce qui a peu
d'impact pour un code "pensé" en 32 bits (voir 16).

Yves





More information about the gull mailing list