Disons que j'ai une fonction inline comme this:Comment le compilateur gère-t-il la fonction inline?
inline double CalculateValue() {
// some condition
if (true) {
// some other condition
if (true) {
// another condition
if (true) {
return 1.0;
}
// somethings
std::cout << "inside1" << std::endl;
}
// somethings
std::cout << "inside2" << std::endl;
}
return 2.0;
}
void Process() {
double value = CalculateValue();
value *= 100.0;
std::cout << value << std::endl;
}
int main()
{
Process();
}
Il sera « copier-coller » la fonction CalculateValue()
dans le Process()
un. Le résultat est 100
, comme prévu.
Mais si j'essaie de emulate comment cette « copier-coller » sera réalisée, il y a quelque chose que je ne comprends pas:
void Process() {
double value;
// some condition
if (true) {
// some other condition
if (true) {
// another condition
if (true) {
value = 1.0;
return;
}
// somethings
std::cout << "inside1" << std::endl;
}
// somethings
std::cout << "inside2" << std::endl;
}
value = 2.0;
value *= 100.0;
std::cout << value << std::endl;
}
int main()
{
Process();
}
Bien sûr, quand il atteint l'instruction return
, le reste de la fonction doit être ignoré (c.-à-d. inside1
et inside2
ne doit jamais être imprimé), à cause du return
. Mais si je return
de la fonction parente (Process()
), il revient immédiatement, donc je ne peux jamais voir 100
.
Cela signifie qu'il le fait d'une autre manière.
Comment le compilateur gère-t-il cette situation? J'ai essayé de créer un bloc de code, mais toujours le return
retourne à la fonction principale ...
Le compilateur n'utilise évidemment pas de retour, je ne sais pas exactement lequel est utilisé, mais il y a beaucoup d'autres options comme ' tandis que (1) {... break; } 'ou même' goto' ou des étapes plus obscures avec asm – slawekwin
'inline' ne change pas la sémantique d'un appel de fonction, seulement son lien. – sp2danny