inline en C

inline en C - C++ - Programmation

Marsh Posté le 07-02-2003 à 11:24:30    

Code :
  1. static int
  2. geiCmpTinyMosaic(
  3. tinyMosaicRec   *pRec1,
  4. tinyMosaicRec   *pRec2
  5. )
  6. {
  7. return dbIsIdEqual(pRec1->mosaicId, pRec2->mosaicId) ? 1 : 0;
  8. }


=> ca compile

Code :
  1. inline int
  2. geiCmpTinyMosaic(
  3. tinyMosaicRec   *pRec1,
  4. tinyMosaicRec   *pRec2
  5. )
  6. {
  7. return dbIsIdEqual(pRec1->mosaicId, pRec2->mosaicId) ? 1 : 0;
  8. }


=> syntax error, empty declaration :??:
 
pourquoi j'obtiens ce resultat et comment resoudre le probleme ?

Reply

Marsh Posté le 07-02-2003 à 11:24:30   

Reply

Marsh Posté le 07-02-2003 à 11:52:16    

Arrette le C et passe au C++. Comme ça le mot clef inline sera reconnu :D

Reply

Marsh Posté le 07-02-2003 à 12:29:34    

Kristoph > "inline" est reconnu par des compilateurs C... récents !
 
joce > regarde donc la version de ton compilo, à mon avis une bonne mise à jour s'impose


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 07-02-2003 à 12:31:25    

En C99, le inline est valide..
 
Si t'as gcc, force le C99 pour voir (-std=gnu99)

Reply

Marsh Posté le 07-02-2003 à 12:34:35    

*Syl* a écrit :

En C99, le inline est valide..
 
Si t'as gcc, force le C99 pour voir (-std=gnu99)


à mon avis, le compilo de joce en est encore au C89 :d


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 07-02-2003 à 13:19:39    

*Syl* a écrit :

En C99, le inline est valide..
 
Si t'as gcc, force le C99 pour voir (-std=gnu99)

:non: -std=c99  
depuis quand gnu fait il parti du commité iso  :D  
 
ça marche tres bien, ça fait la vie dure aux macros de musaran

Reply

Marsh Posté le 07-02-2003 à 13:26:01    

Kristoph a écrit :

Arrette le C et passe au C++. Comme ça le mot clef inline sera reconnu :D

desole, je peux pas me permettre de passer en C++ sur un projet comme ca :D

Reply

Marsh Posté le 07-02-2003 à 13:28:05    

*Syl* a écrit :

En C99, le inline est valide..
 
Si t'as gcc, force le C99 pour voir (-std=gnu99)

c'est un compilo sous solaris :
 
cc -V
cc: WorkShop Compilers 5.0 98/12/15 C 5.0

Reply

Marsh Posté le 07-02-2003 à 13:28:42    

Harkonnen a écrit :


à mon avis, le compilo de joce en est encore au C89 :d

c'est pas le mien c'est celui de la boite :o

Reply

Marsh Posté le 07-02-2003 à 13:32:49    

joce a écrit :

cc: WorkShop Compilers 5.0 98/12/15 C 5.0
 


[:meganne]


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 07-02-2003 à 13:32:49   

Reply

Marsh Posté le 07-02-2003 à 13:34:39    

j'y peux rien [:spamafote]

Reply

Marsh Posté le 07-02-2003 à 13:37:40    

il sert a koi le inline la ? (en C je veux dire)


Message édité par Lolo- le 07-02-2003 à 13:38:04
Reply

Marsh Posté le 07-02-2003 à 13:40:05    

++Taz a écrit :

:non: -std=c99  
depuis quand gnu fait il parti du commité iso  :D  
 
ça marche tres bien, ça fait la vie dure aux macros de musaran

Ouep, c'est vrai, mais p't'être qu'il veut les extensions gnu en sus du C99 :whistle:

Reply

Marsh Posté le 07-02-2003 à 13:42:38    

Lolo- a écrit :

il sert a koi le inline la ? (en C je veux dire)


à inclure le corps de la fonction dans l'éxécutable compilé à chaque appel.
 
ça évite un "call" et un "ret" en assembleur, et tu dois gagner 2-3 cycles à chaque fois :d
 
par contre, pour peu que tu y fasses appel souvent, ça gonfle l'éxécutable final


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 07-02-2003 à 13:59:26    

Harkonnen a écrit :


à inclure le corps de la fonction dans l'éxécutable compilé à chaque appel.
 
ça évite un "call" et un "ret" en assembleur, et tu dois gagner 2-3 cycles à chaque fois :d
 
par contre, pour peu que tu y fasses appel souvent, ça gonfle l'éxécutable final


ouais mais quand la fonction est appelee 12 millions de fois ca commence a jouer

Reply

Marsh Posté le 07-02-2003 à 14:02:27    

joce a écrit :


ouais mais quand la fonction est appelee 12 millions de fois ca commence a jouer


tout dépend effectivement du nombre de fois ou tu appelles la fonction, mais dans ce cas, pour peu que ta fonction soit assez conséquente, tu risques quand meme d'avoir un exécutable XXL  :sweat:


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 07-02-2003 à 14:02:32    

Bah si ton compilo accepte pas le inline, tu peux remplacer ta fonction par une macro..

Reply

Marsh Posté le 07-02-2003 à 14:05:53    

*Syl* a écrit :

Bah si ton compilo accepte pas le inline, tu peux remplacer ta fonction par une macro..

:o  
 
plus sérieusement du ferais peut etre bien de te pencher sur la doc de ton compilo pour connaitre ses options d'optimisations ou peut etre essayer de rentrer tes boucles dans tes fonctions pour eviter les sauts

Reply

Marsh Posté le 07-02-2003 à 14:08:23    

Ça m'aurait étonné.. :)
 
Pkoi c'est mal ?

Reply

Marsh Posté le 07-02-2003 à 14:14:24    

par ce que ça multiplie les risques d'effet de bord. et pis si la programmation était aussi simple que du search&replace, ça se saurait.

Reply

Marsh Posté le 07-02-2003 à 14:16:40    

Wé j'suis d'accord mais quand t'écris une macro, généralement tu fais gaffe à ça donc si son compilo accepte pas le inline, j'pense que c'est la meilleure des solutions..


Message édité par *syl* le 07-02-2003 à 14:17:00
Reply

Marsh Posté le 07-02-2003 à 14:17:47    

joce a écrit :

desole, je peux pas me permettre de passer en C++ sur un projet comme ca :D


 
Et alors, le code C est sensé être compilable tel quel ou presque par un compilateur C++. C'est tout ce que je suggerais.
 
De toute façon, c'est soit ça, soit changer de compilateur C, soit les macros ...

Reply

Marsh Posté le 07-02-2003 à 14:18:40    

ben si joce à fait une fonction et pas une macro, c'est justement parce que sont traitement est sans doute un peu trop "gros" pour une simple macro

Reply

Marsh Posté le 07-02-2003 à 14:21:06    

Si c'est la fonction qu'il a mis en haut, c'est pas la mort de la mettre dans une macro.. C'est clair que si t'as une macro qui commence à faire une 10ène de lignes ou +, ça craint..


Message édité par *syl* le 07-02-2003 à 14:21:41
Reply

Marsh Posté le 07-02-2003 à 14:25:29    

tout en effet. je serais curieux de voir ce que dbIsIdEqual, par ce que l'opérateur ternaire de geiCmpTinyMosaic est assez couteux et sans doute inutile (moi j'ai l'impression de lire if(true) return true else return false)
 
edit: on est bien d'accord, static n'est pas le contraire d'inline


Message édité par Taz le 07-02-2003 à 14:26:04
Reply

Marsh Posté le 07-02-2003 à 14:52:01    

me semblait que les fonctions étaient pas "inlinées" par les compilo si elles contiennent une boucle ou un test
on m'aurait menti ?

Reply

Marsh Posté le 07-02-2003 à 14:53:25    

Lolo- a écrit :

me semblait que les fonctions étaient pas "inlinées" par les compilo si elles contiennent une boucle ou un test
on m'aurait menti ?

oui: tout ça depend du compilo, du niveau d'optimisation, de la prise en compte ou pas des directives de l'utilisateur (inline ne garantit rien, c'est just epour inciter le compilo: il peut tres bien inliner une fonctions pas inline et vice versa)

Reply

Marsh Posté le 07-02-2003 à 16:09:35    

je viens de regarder a quoi correspond dbIsIdEqual :
 
#define dbIsIdEqual(id1, id2) (id1 == id2)
 
:D

Reply

Marsh Posté le 07-02-2003 à 16:20:52    

++Taz a écrit :

ben si joce à fait une fonction et pas une macro, c'est justement parce que sont traitement est sans doute un peu trop "gros" pour une simple macro

c'est pas moi est fait la macro, mais l'appel de la fonction est apparement faite dans une macro.

Reply

Marsh Posté le 07-02-2003 à 17:20:36    

joce a écrit :

c'est pas moi est fait la macro, mais l'appel de la fonction est apparement faite dans une macro.


ben il ne te reste plus qu'a utiliser un compilo c++ pour compiler ton code C, comme le suggère Krystoph :jap:


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 07-02-2003 à 17:26:44    

Harkonnen a écrit :


ben il ne te reste plus qu'a utiliser un compilo c++ pour compiler ton code C, comme le suggère Krystoph :jap:

c'est pas a moi de choisir les outils utilises pour compiler l'application

Reply

Marsh Posté le 07-02-2003 à 17:40:48    

joce a écrit :

c'est un compilo sous solaris :
 
cc -V
cc: WorkShop Compilers 5.0 98/12/15 C 5.0
 


 
 
T'as plus qu'à l'écrire en assembleur [:matleflou]
 
Sinon Workshop supporte les inline avec -xinline=nom_de_la fonction...
 
Et puis faudrait voire à passer à la version 6.0 au moins :)


---------------
Horizon pas Net, reste à la buvette!!
Reply

Marsh Posté le 07-02-2003 à 17:53:23    

Willyzekid a écrit :


 
 
T'as plus qu'à l'écrire en assembleur [:matleflou]
 
Sinon Workshop supporte les inline avec -xinline=nom_de_la fonction...
 
Et puis faudrait voire à passer à la version 6.0 au moins :)

comme dit plus haut c'est pas moi qui decide [:spamafote]

Reply

Marsh Posté le 07-02-2003 à 18:18:16    

joce a écrit :

je viens de regarder a quoi correspond dbIsIdEqual :
 
#define dbIsIdEqual(id1, id2) (id1 == id2)
 
:D

ben à ce moment la je ne vois pas trop l'interet du test. si tu dois le faire 12miyon de fois comme tu dis

Reply

Marsh Posté le 07-02-2003 à 19:20:49    

++Taz a écrit :

ben à ce moment la je ne vois pas trop l'interet du test. si tu dois le faire 12miyon de fois comme tu dis

moi non plus
mais j'ai l'impression qu'il y a l'utilisation d'un pointeur sur la fonction au niveau de la macro qui utilise cette fonction.

Reply

Marsh Posté le 07-02-2003 à 19:24:40    

Citation :

#define dbIsIdEqual(id1, id2) (id1 == id2)

je croyais que les macro permettient une ecriture plus courte?
 
 
 
plus sérieusement, si tu es bloqué sur cette fonction, il a surement d'autre moyen d'accélerer ton traitement. il dit quoi ton profiler?

Reply

Marsh Posté le 07-02-2003 à 21:43:28    

++Taz a écrit :

Citation :

#define dbIsIdEqual(id1, id2) (id1 == id2)

je croyais que les macro permettient une ecriture plus courte?
 
 
 
plus sérieusement, si tu es bloqué sur cette fonction, il a surement d'autre moyen d'accélerer ton traitement. il dit quoi ton profiler?

ch'uis pas bloqué, mais à la base je me demandais pkoi il jetait mon inline :)

Reply

Marsh Posté le 07-02-2003 à 22:10:13    

de toutes façon si c'est un bon compilo, il fera des inlines automatiques suivant certains critères (appel unique ou faible de la fonction, etc...)

Reply

Marsh Posté le 07-02-2003 à 22:17:25    

BJOne a écrit :

de toutes façon si c'est un bon compilo, il fera des inlines automatiques suivant certains critères (appel unique ou faible de la fonction, etc...)

tient d'ailleurs en parlant de ca, j'ai rencontré un cas trop bizarre en C++ avec le compilo sur solaris : en virant un inline j'ai gagné 10% de perf sur l'application.
Le nm montrait plein de WEAK sur la fonction en question (apparement parce que la fonction inlinée comportait des variables statiques - je précise que c'est pas moi qui ait inliné la fonction :D - ).  
Une idée de la raison d'un tel comportement ?

Reply

Marsh Posté le 07-02-2003 à 22:53:17    

Je sais que l'inline peut faire perdre des perfs quand ça cause des cache miss sur le code.

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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