static inline - C++ - Programmation
Marsh Posté le 25-01-2011 à 08:11:37
oui et oui
Marsh Posté le 25-01-2011 à 09:48:12
esox_ch a écrit : oui et oui |
merci, serait ce possible d'avoir plus d'explications ? En fait selon moi le cas 1 veut dire qu'on peut appeler les méthodes sans instancier de classe, et le fait qu'elles soient inline qu'elles sont cut&pastés dans le code au lieu d'avoir une adresse en mémoire. Mais j'ai du mal à voir ce que ça change avec le cas 2 si les fonctions n'étaient pas statiques dans une classe. Quand choisit-on l'un ou l'autre ?
merki
Marsh Posté le 25-01-2011 à 10:38:25
inline indique à ton compilateur que tu voudrais éviter de générer un appel à cette fonction et plutôt copier son contenu à l'endroit de l'appel. Cela dit, ce n'est qu'une indication (ton compilateur n'en tient pas forcément compte)
static dans une classe, c'est effectivement pour dire que cette méthode n'est pas appelée sur une instance.
static hors d'une classe veut dire que le symbole va être local à l'unité de compilation et ne sera pas disponible pour les autres.
Marsh Posté le 25-01-2011 à 14:41:13
theshockwave a écrit : inline indique à ton compilateur que tu voudrais éviter de générer un appel à cette fonction et plutôt copier son contenu à l'endroit de l'appel. Cela dit, ce n'est qu'une indication (ton compilateur n'en tient pas forcément compte) |
ok merci! mais alors quel est l'interêt de static inline dans l'un et l'autre cas ?? Dans le second cas je dirais que je ne vois pas .... et dans le premier cas non plus en fait, lol. Je comprend pas quand utiliser de static inline ...
Marsh Posté le 25-01-2011 à 18:15:02
c'est pas mutuellement exclusif. Dans le cas d'une méthode de classe static inline, tu précises juste que cette fonction, en plus de ne pas être appelée sur une instance sera probablement mieux dupliquée à chaque référence.
Même pour le cas de la fonction static hors d'une classe, ca peut avoir du sens si c'est une fonction assez courte de la marquer comme inline.
Il ne faut pas prendre static inline comme un seul bloc sémantique, ce sont deux informations qui n'ont rien à voir. Si tu vois comment utiliser inline et que tu vois le sens de static, c'est pas difficile d'envisager un recouvrement des cas d'utilisation.
un faux exemple d'utilisation :
Code :
|
Marsh Posté le 25-01-2011 à 19:17:25
ok merci! Alors je crois que je comprend le cas 1) - dans une classe. Mais pour le cas 2, quand on parle de static cela veut dire que le code est visible juste dans le fichier ou il est déclaré (internal linkage), non ? Dans ce cas n'est ce pas redondant -dumoins inutile et sans effet- d'avoir inline, alors que c'est statique ? i.e le code sera cut&pasté (inline), alors statique ne sert à rien.
Marsh Posté le 26-01-2011 à 10:20:18
inline a toujours le même effet, que la portée de la fonction soit restreinte à une unité de compilation ou non. Elle peut toujours être référencée plusieurs fois dans ton unité ou non et mériter ou non d'être inlinée.
Le code que je t'ai mis dans mon post précédent pourrait très bien se traduire en C avec la fonction UnpackOne qui serait static inline dans le fichier .c où est implémentée la fonction Unpack.
J'ai toujours un peu de mal à voir ce qui te chiffonne ici.
Marsh Posté le 26-01-2011 à 10:25:18
Je crois qu'il mélange l'effet de inline, qui est transparant pour l'utilisateur et n'est qu'une indication d'optimisation possible à effectuer par le compilateur, et static, qui lui a vraiment une utilité "directe" pour le dev
Marsh Posté le 26-01-2011 à 10:49:23
Je me greffe pour un petit truc.
static devant une fonction libre permet de limiter sa visibilité à l'unité de compilation dans laquelle elle est définie. Comment ça se passe dans le cas d'une fonction static template? Ou plus généralement une fonction static implémentée dans un .h ?
static devant une fonction membre permet de faire quoi exactement? Ca permet de faire appel à la fonction hors d'une instance de la classe? Dans ce cas private static, c'est quoi? Toujours dans ce cas, est ce que ca veut dire que je peux appeller la fonction static sans avoir instancié d'objet de la classe ou elle est définie? Quel est l'intérêt par rapport à une fonction libre?
Marsh Posté le 26-01-2011 à 11:07:12
snafu8 a écrit : Je me greffe pour un petit truc. |
Si je ne me goure pas, tu ne peux pas avoir de template de fonctions statique.
Citation : Ou plus généralement une fonction static implémentée dans un .h ? |
Tu en as a une par unite de compilation. Les .h, c'est un machin du preprocesseur et ca n'intervient pas dans les regles du langage.
Citation : static devant une fonction membre permet de faire quoi exactement? ... Quel est l'intérêt par rapport à une fonction libre? |
C'est dans le scope de la classe donc a acces a ce qui est prive dans la classe. Par rapport a une fonction libre et amie... le scope est different, c'est tout.
Marsh Posté le 27-01-2011 à 14:45:50
theshockwave a écrit : J'ai toujours un peu de mal à voir ce qui te chiffonne ici. |
hello,
en fait, c'est pour le 2) : une fonction statique et inline mais pas dans une classe.
Si la fonction est inline, pour moi ça veut dire que le code sera tout simplement remplacé (copié/collé) aux endroits où c'est appelé, comme une macro dans le principe.
Donc si c'est le cas, je ne vois pas l'interêt de dire que c'est statique, puisque comme le code est copié/collé il est forcément visible uniquement qu'à l'endroit où on l'a copié
je ne sais pas si vous comprenez ...
Marsh Posté le 28-01-2011 à 09:52:17
<Pour ce que j'en ai compris>
inline c'est pas comme #define. Le préprocesseur va remplacer une chaine de caractère dans ton fichier source avant de le compiler dans le cas de #define. Dans le cas de inline, le compilateur va remplacer du code machine après la compilation et les optimisations éventuelles. Donc avant de faire ça, il est bien obligé de gérer les appels de fonctions, l'instanciations des templates, et le scope des fonctions.
Marsh Posté le 28-01-2011 à 12:01:07
ce qu'il faut voir, c'est qu'une fonction qui n'est pas déclarée en static mais est implémentée uniquement dans un fichier .c ou .cpp peut être déclarée dans une autre unité directement et utilisée comme telle, fut-elle inline ou non.
Exemple :
PlusX.h
Code :
|
PlusX.c
Code :
|
foo.c :
Code :
|
ce code est valide, la déclaration de la fonction PlusUn dans foo.c ne pose aucun souci et PlusUn sera bien inlinée (au moins dans PlusX.c ... éventuellement aussi dans foo.c pour certains compilateurs). Par contre, si tu déclares PlusUn avec static dans PlusX.c, alors tu obtiendras une erreur de link en compilant ces fichiers.
Marsh Posté le 28-01-2011 à 16:45:58
Un Programmeur a écrit : |
Si si, mais ca sert bien a rien
Marsh Posté le 24-01-2011 à 23:54:23
Bonjour,
J'aimerais savoir s'il est correct de faire cela et si ça a un intérêt :
1)
Par ailleurs, est ce que faire
a une signification différente de 1) ?
merci par avance
Message édité par in_your_phion le 24-01-2011 à 23:55:33