Je lis cette question sur inline
sur FAQ isocpp le code est donné comme suit
void f()
{
int x = /*...*/;
int y = /*...*/;
int z = /*...*/;
// ...code that uses x, y and z...
g(x, y, z);
// ...more code that uses x, y and z...
}
alors il est dit que
En supposant une implémentation typique de C++ qui a des registres et une pile, les registres et les paramètres sont écrits sur la pile juste avant l'appel appel à
g()
puis les paramètres sont lus à partir de la pile à l'intérieur de l'appareilg()
et relire pour restaurer les registres pendant queg()
retourne àf()
. Mais cela fait beaucoup de lecture et d'écriture inutiles, surtout dans les cas où le compilateur est capable d'utiliser les registres pour les variablesx
,y
etz
chaque variable peut être écrite deux fois (comme registre et comme également comme paramètre) et lue deux fois (lorsqu'elle est utilisée à l'intérieur deg()
et pour restaurer les registres lors du retour àf()
).
J'ai une grande difficulté à comprendre le paragraphe ci-dessus. J'essaie d'énumérer mes questions comme suit :
- Pour qu'un ordinateur puisse effectuer des opérations sur des données qui se trouvent dans la mémoire principale, est-il vrai que les données doivent d'abord être chargées dans des registres, puis l'unité centrale de traitement peut effectuer des opérations sur ces données ? (Je sais que cette question n'est pas particulièrement liée au C++, mais comprendre cela sera utile pour comprendre le fonctionnement du C++).
- Je pense
f()
est une fonction, de la même manière queg(x, y, z)
est une fonction. Comment se fait-il quex, y, z
avant d'appelerg()
sont dans les registres, et les paramètres passés eng()
sont sur la pile ? - Comment sait-on que les déclarations de
x, y, z
les faire stocker dans les registres ? Où les données à l'intérieurg()
est stocké, registre ou pile ?
PS
Il est très difficile de choisir une réponse acceptable lorsque les réponses sont toutes très bonnes (par exemple, celles fournies par @MatsPeterson, @TheodorosChatzigiannakis, et @superultranova) je pense. Personnellement, j'aime un peu plus la réponse de @Potatoswatter, car elle propose des lignes directrices.