Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1564 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  static inline

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

static inline

n°2051538
in_your_ph​ion
Posté le 24-01-2011 à 23:54:23  profilanswer
 

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
mood
Publicité
Posté le 24-01-2011 à 23:54:23  profilanswer
 

n°2051552
esox_ch
Posté le 25-01-2011 à 08:11:37  profilanswer
 

oui et oui


---------------
Si la vérité est découverte par quelqu'un d'autre,elle perd toujours un peu d'attrait
n°2051570
in_your_ph​ion
Posté le 25-01-2011 à 09:48:12  profilanswer
 

 

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
n°2051588
theshockwa​ve
I work at a firm named Koslow
Posté le 25-01-2011 à 10:38:25  profilanswer
 

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
n°2051684
in_your_ph​ion
Posté le 25-01-2011 à 14:41:13  profilanswer
 

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

n°2051809
theshockwa​ve
I work at a firm named Koslow
Posté le 25-01-2011 à 18:15:02  profilanswer
 

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
n°2051828
in_your_ph​ion
Posté le 25-01-2011 à 19:17:25  profilanswer
 

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
n°2051910
theshockwa​ve
I work at a firm named Koslow
Posté le 26-01-2011 à 10:20:18  profilanswer
 

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
n°2051915
esox_ch
Posté le 26-01-2011 à 10:25:18  profilanswer
 

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
n°2051929
snafu8
Posté le 26-01-2011 à 10:49:23  profilanswer
 

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?

mood
Publicité
Posté le 26-01-2011 à 10:49:23  profilanswer
 

n°2051936
Un Program​meur
Posté le 26-01-2011 à 11:07:12  profilanswer
 

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)
n°2052377
in_your_ph​ion
Posté le 27-01-2011 à 14:45:50  profilanswer
 

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
n°2052572
snafu8
Posté le 28-01-2011 à 09:52:17  profilanswer
 

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

n°2052655
theshockwa​ve
I work at a firm named Koslow
Posté le 28-01-2011 à 12:01:07  profilanswer
 

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
n°2052744
Joel F
Real men use unique_ptr
Posté le 28-01-2011 à 16:45:58  profilanswer
 

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


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  static inline

 

Sujets relatifs
Forcer les classes filles à avoir des méthodes/attributs staticquestion sur static
initialisation static[Static Control] NOWORDWRAP
question sur static et multithread<ul> (pas <li>) en inline
Convertir inline CSS en règles ? Converts inline style into CSS ruleslib shared, optim facon static ?
static_cast<> mal compris ?FUNCTOR vs static
Plus de sujets relatifs à : static inline


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR