inline en C - C++ - Programmation
Marsh Posté le 07-02-2003 à 11:52:16
Arrette le C et passe au C++. Comme ça le mot clef inline sera reconnu
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
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)
Marsh Posté le 07-02-2003 à 12:34:35
*Syl* a écrit : En C99, le inline est valide.. |
à mon avis, le compilo de joce en est encore au C89
Marsh Posté le 07-02-2003 à 13:19:39
*Syl* a écrit : En C99, le inline est valide.. |
-std=c99
depuis quand gnu fait il parti du commité iso
ça marche tres bien, ça fait la vie dure aux macros de musaran
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 |
desole, je peux pas me permettre de passer en C++ sur un projet comme ca
Marsh Posté le 07-02-2003 à 13:28:05
*Syl* a écrit : En C99, le inline est valide.. |
c'est un compilo sous solaris :
cc -V
cc: WorkShop Compilers 5.0 98/12/15 C 5.0
Marsh Posté le 07-02-2003 à 13:28:42
Harkonnen a écrit : |
c'est pas le mien c'est celui de la boite
Marsh Posté le 07-02-2003 à 13:32:49
joce a écrit : cc: WorkShop Compilers 5.0 98/12/15 C 5.0 |
Marsh Posté le 07-02-2003 à 13:37:40
il sert a koi le inline la ? (en C je veux dire)
Marsh Posté le 07-02-2003 à 13:40:05
++Taz a écrit : -std=c99 |
Ouep, c'est vrai, mais p't'être qu'il veut les extensions gnu en sus du C99
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
par contre, pour peu que tu y fasses appel souvent, ça gonfle l'éxécutable final
Marsh Posté le 07-02-2003 à 13:59:26
Harkonnen a écrit : |
ouais mais quand la fonction est appelee 12 millions de fois ca commence a jouer
Marsh Posté le 07-02-2003 à 14:02:27
joce a écrit : |
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
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..
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.. |
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
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.
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..
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 |
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 ...
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
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..
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
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 ?
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 |
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)
Marsh Posté le 07-02-2003 à 16:09:35
je viens de regarder a quoi correspond dbIsIdEqual :
#define dbIsIdEqual(id1, id2) (id1 == id2)
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.
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
Marsh Posté le 07-02-2003 à 17:26:44
Harkonnen a écrit : |
c'est pas a moi de choisir les outils utilises pour compiler l'application
Marsh Posté le 07-02-2003 à 17:40:48
joce a écrit : c'est un compilo sous solaris : |
T'as plus qu'à l'écrire en assembleur
Sinon Workshop supporte les inline avec -xinline=nom_de_la fonction...
Et puis faudrait voire à passer à la version 6.0 au moins
Marsh Posté le 07-02-2003 à 17:53:23
Willyzekid a écrit : |
comme dit plus haut c'est pas moi qui decide
Marsh Posté le 07-02-2003 à 18:18:16
joce a écrit : je viens de regarder a quoi correspond dbIsIdEqual : |
ben à ce moment la je ne vois pas trop l'interet du test. si tu dois le faire 12miyon de fois comme tu dis
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.
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?
Marsh Posté le 07-02-2003 à 21:43:28
++Taz a écrit :
je croyais que les macro permettient une ecriture plus courte? |
ch'uis pas bloqué, mais à la base je me demandais pkoi il jetait mon inline
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...)
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 - ).
Une idée de la raison d'un tel comportement ?
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.
Marsh Posté le 07-02-2003 à 11:24:30
=> ca compile
=> syntax error, empty declaration
pourquoi j'obtiens ce resultat et comment resoudre le probleme ?