static inline

static inline - C++ - Programmation

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)

Code :
  1. class A {
  2.     static inline void toto() { /* du code */ }
  3. };

 

Par ailleurs, est ce que faire

Code :
  1. static inline void toto() { /* du code, mais la fonction n'est pas une méthode de classe */}


a une signification différente de 1) ?

 


merci par avance


Message édité par in_your_phion le 24-01-2011 à 23:55:33
Reply

Marsh Posté le 24-01-2011 à 23:54:23   

Reply

Marsh Posté le 25-01-2011 à 08:11:37    

oui et oui


---------------
Si la vérité est découverte par quelqu'un d'autre,elle perd toujours un peu d'attrait
Reply

Marsh Posté le 25-01-2011 à 09:48:12    

 

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


Message édité par in_your_phion le 25-01-2011 à 09:48:57
Reply

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.


---------------
last.fm
Reply

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)
 
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.


 
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 ...

Reply

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 :
  1. class FP16Vector
  2. {
  3.   uint16 val[4];
  4.   static inline void UnpackOne( uint16 InputVal, float& OutputVal ) { /*conversion FP16 vers FP32*/ };
  5.   void Unpack( float Output[4] );
  6. };
  7. void FP16Vector::Unpack( float Output[4] )
  8. {
  9.   UnpackOne( val[0], Output[0] );
  10.   UnpackOne( val[1], Output[1] );
  11.   UnpackOne( val[2], Output[2] );
  12.   UnpackOne( val[3], Output[3] );
  13. }


---------------
last.fm
Reply

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.


Message édité par in_your_phion le 25-01-2011 à 19:19:07
Reply

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.


---------------
last.fm
Reply

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


---------------
Si la vérité est découverte par quelqu'un d'autre,elle perd toujours un peu d'attrait
Reply

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?

Reply

Marsh Posté le 26-01-2011 à 10:49:23   

Reply

Marsh Posté le 26-01-2011 à 11:07:12    

snafu8 a écrit :

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?


 
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.


---------------
The truth is rarely pure and never simple (Oscar Wilde)
Reply

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é  :pt1cable:

 

je ne sais pas si vous comprenez ...


Message édité par in_your_phion le 27-01-2011 à 14:46:18
Reply

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.

Reply

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 :
  1. int PlusX( int a, int b );


 
PlusX.c

Code :
  1. inline int PlusUn( int i )
  2. {
  3.   return ++i;
  4. }
  5. int PlusX( int a, int b )
  6. {
  7.   for( int i = 0; i < b; i = PlusUn( i ) )
  8.   {
  9.     a = PlusUn( a );
  10.   }
  11. }


 
foo.c :

Code :
  1. #include "PlusX.h"
  2. int PlusUn( int );
  3. int Foo()
  4. {
  5.   int a = 0;
  6.   a = PlusX( a, PlusUn( a ) );
  7.   a = PlusUn( a );
  8.   return a;
  9. }


 
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.


Message édité par theshockwave le 28-01-2011 à 12:03:07

---------------
last.fm
Reply

Marsh Posté le 28-01-2011 à 16:45:58    

Un Programmeur a écrit :


 
Si je ne me goure pas, tu ne peux pas avoir de template de fonctions statique.


 
Si si, mais ca sert bien a rien

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed