Juste un petit mot à propos de Java, et permettez-moi de le dire d'abord: je ne suis pas inquiet à cause de l'optimisation des performances, juste curieux de savoir sur les choses en coulisses en général. Depuis que je ne trouve rien à ce que je suppose qu'ils sont équivalents à tous égards, mais juste pour être sûr:Appel de fonction avec i + 1, ++ i différence d'implémentation?
Dans une fonction récursive foo(int i)
, ou je suppose que dans generel dans un appel de fonction, est-il une différence entre foo(++i)
et foo(i + 1)
? Je sais que le résultat est le même, mais je pensais que celui avec ++i
pourrait faire un extrawork en arrière-plan parce que c'est une tâche? Donc peut-être cela crée-t-il un (anonymous field) = i
en arrière-plan qui est incrémenté puis référencé? Ou est-ce que le compilateur optimise simplement ++i
à i + 1
?
Ma compréhension est un peu floue comme vous le voyez, donc de l'aide serait appréciée.
EDIT pour clarifier:
Au début, cela était dû à une fonction récursive par exemple
public static int foo(int i) {
return (i >= 4) ? 0
: i + foo(++i);
}
Les fonctions « en général » -part est venu en train d'écrire la question et, comme le remarque, rend cette ambiguïté, etc. Espérons que cela clarifie tout.
Je vous suggère d'utiliser http://docs.oracle.com/javase/7/docs/technotes/tools/windows/javap.html sur deux classes simples (ou sur une classe avec deux méthodes) chacun avec l'un des les deux approches, vous aurez une meilleure compréhension de la chose plutôt que de lire une réponse ici ^^ –
le compilateur JIT pourrait en effet faire une telle optimisation sur la base que 'I' est mort après l'augmentation. Qu'il fasse réellement une telle optimisation est une autre question. Le compilateur Java-to-bytecode n'optimisera pas cela pour vous, cependant; l'incrément sera dans le bytecode. C'est 100% jusqu'au compilateur JIT pour optimiser. –
* "Je sais que le résultat est le même" * Dépend du code. Si vous accédez à "i" plus d'une fois, le résultat n'est pas le même. – Tom