temps de compilation long, tres long (voir apocalyptique. Ex: compiler gcc ou giacs. Lequels est le plus rapide a se compiler ?).
langage hybride permettant le haut-niveau et le bas-niveau. Code pervers aisement facile. On peut toujours manipuler la memoire et des objects en meme temps. Ils auraient mieux fait d'autoriser le linkage avec le code C bas-niveau et ne mettre rien de bas niveau dans la syntaxe C++.
Pas de DLL ! (Sauf si on aime les bugs).
Moins supporte par les compilateurs que le C K&R. (Vous vous en foutez ? Pas moi.).
Mais on peut facilement faire des templates (certes moins pousse mais suffisante pour la plupart des utilisation) en C.
Plus lent meme pour appeller une fonction C (J'ai fait un programme de bench. L'un compiler en mode C++, l'autre en mode C - le MEME programme! - ou le bench consiste a appeller une fonction C d'une librarie. Le programme C++ donne des resultats plus lent que le C). Sans parler de la syntaxe "x=a+b" plus lente que set(x,a,b); (sauf si on definit tres bien sa classe...).
Mauvaise utilisation par les programmeurs qui tendent a faire exploser la gestion de la heap par une vague incessente de constructions/destructions.
Bref, le C++ c'est peut etre bien, mais j'ai encore rencontre personne le maitrissant
C'est quoi que tu peux faire en C++ 100x plus simple qu'en C ?
nitro :
Oui c'est vrai, et g++ 3 est particulierement lent. Visual C++ est nettement plus rapide (headers précompilés + link incrémental), mais il a d'autres défauts.
Mais on est d'accord sur l'utilité d'un langage de haut niveau propre (et plus rapide que Java).
Sous Linux, KDE+Qt c'est plein de lib dynamiques de partout, avec du vrai C++, et ça marche très bien.
BeOS également utilisait une API 100% C++, et les libs dynamiques marchaient aussi.
En plus de nos jours il y a une ABI standard alors ça ne peut qu'aller mieux.
Avec des macros ? Pas de typage bonjour les bugs.
Pas normal... tu as regardé la différence dans le code généré ?
Les bons programmeurs de C++ sont rares.
J'en cotoie quotidiennementc'est l'une des spécialités du labo de recherches dans lequel je travaille (mais certainement pas ma spécialité).
Faire une interface graphique avec des widgets c'est moulte fois plus simple en C++ (j'ai tenté les deux).
Et puis ya qu'à voir le code de Gtk comparé à Qt... aucun rapport
sBibi: C'est quoi que tu peux faire en C++ 100x plus simple qu'en C ?
Et tu aurais du faire une liste chainee de tableau fixe.
Entre autre des fichiers dechets qui prennent plein de place.
Une DLL me cree et me retourne un object. Est-ce correct de faire un delete myobject ? Ou c'est a la DLL de le faire ?
Et tu peux meme faire un systeme pour automatiser la creation d'une mega-macro max qui detecte le type (Perso j'aime bien comme c'est).
Pour a = b+c ou pour le meme appel en fonction du mode de compilation ?
Je dis bien maitriser, pas connaitre parfaitement.
Je trouve toutes les interfaces graphiques trop compliques.
nitro
: Le but étant d'etre compatible avec du C, ça n'aurait pas pu etre autrement. Mais on est d'accord sur l'utilité d'un langage de haut niveau propre (et plus rapide que Java).
Pas de DLL ! (Sauf si on aime les bugs).
Sous Linux, KDE+Qt c'est plein de lib dynamiques de partout, avec du vrai C++, et ça marche très bien.
En plus de nos jours il y a une ABI standard alors ça ne peut qu'aller mieux.
PpHd
: Je trouve toutes les interfaces graphiques trop compliques.
sBibi
: overloader des operateurs et des fonctions (je sais pas si le terme overloader s'applique aux fonctions, ce que je veux dire, c'est plusieurs fonctions qui ont le meme nom mais des parametres differents, et en fonction de l'appel, le compilateur appelle telle ou telle fonction, je sais pas comment ca s'appelle)
si j'avais ca en C, ca simplifierait enormement le code
Kevin> tain mais comment ils ont pu pondre un realloc pareil?enfin bon ma remarque de mon precedent post pour laquelle tu n'a pas reagi tient toujours...
sBibi
: aussi, j'essaye de modulariser mon code au maximum, et tout est decoupe en modules, chaque module ayant son repertoire
or en C, hormis mettre des variables ou des fonctions qui sont censees etre "privees" en static (ce qui implique d'avoir tout le code qui doit s'en servir dans le meme fichier)
un toolkit en C dont j'ai horreur (GTK)
Kevin Kofler :
Comme ça: http://gcc.gnu.org/java/?
1. Ce n'est pas du "vrai C++", c'est du -fno-exceptions.
2. Ça marche très mal. Il faut compiler avec la même version de GCC que la DLL, sinon tout foire. Et il y a plein d'autres problèmes (entre autres avec les exceptions, ce qui ne concerne pas Qt parce qu'elle ne les utilise pas).
Non. L'ABI est tellement complexe que les développeurs de g++ n'arrêtent pas de corriger des bogues de non-conformance, et du coup la compatibilité binaire est toujours perdue à chaque version (ça sera très probablement le cas à nouveau avec GCC 3.4, par exemple).
As-tu essayé ton code sous Linux/glibc?
Sally
:un toolkit en C dont j'ai horreur (GTK)dont tu as horreur à cause de l'aspect ou à cause de l'utilisation de la lib ?
Avec lablgtk c'est le confort d'utilisation ultime
C'est surtout l'aspect graphique qui est horrible. Mais bon, avec Bluecurve, ça ne se remarque presque plus. Heureusement qu'il y a RedHat... (J'ai tout mis en Bluecurve maintenant.)
En quoi c'est long et difficile ? Qu'est-ce que tu pourrais faire en 5 minutes ? (Temps que je juge necessaire pour definir ceci: #define ma_function1 mon_module_ma_function1
Et perso j'ai eu pas mal de problemes avec les namespace en C++ qui m'ont pris bien plus que 5 minutes (Entre autre corriger ces fucking de libs c++).
Bref tu perds du temps a l'ecriture du code, mais tu en gagnes pas mal en temps de compilation. Et perso je sais quel temps j'ai choisi.
Pas forcement.
On peut aussi generer une lib statique par module et un fichier par fonction. C'est aussi courant en C.
[...]
Tu peux faire pour chaque module une lib statique avec dedans tous les fichiers de la libs. Puis le projet linke toutes les libs statiques. Tu peux meme en faire des libs dynamiques.
Ben tvector_matmul_2x2_3x2(a,b,c) C'est vrai que ca demande un peu plus d'effort.
Perso j'aurais ecrit en C:
t_vector_4 truc, machin;
...
t_vector_4_inc(truc, machin);
La logique du C est d'encapsuler le code dans des fonctions (que tu peux definir inline). M'enfin ce que j'ai dit reste vrai.
>si tu veux un code un minimum portable, c'est pas super de se baser sur telle ou telle implementation. Nan, il ne sagissait pas de portabilite mais de performances sur differents systemes.
Ben tvector_matmul_2x2_3x2(a,b,c) C'est vrai que ca demande un peu plus d'effort.
sBibi :
euh oue non mais arrette... ca prend pas 5 min ca, ca prend 20 secondes a taper (le temps de reflechir au nom), c'est pas ca que je voulais dire... et j'ai pas dit que ct long et difficile, juste que c'etait inutile et que quand t'en a des tas a faire, ce temps pourrait etre passe a faire d'autres trucs (en plus d'alourdir les .h)
peut etre, sans doute, ca j'en sais rien, je le repete: j'ai jamais rien fait en C++, je dis juste que vu ce que j'en vois, ce que j'en entends (hormis certains), l'utilisation qui en est faite dans l'industrie, et des tas d'autres trucs, le C++ me parait bcp plus adapte a certains trucs que le C (beaucoup meme...)
et tu l'a peut etre mal choisi... du moins si je faisais ce meme choix (et je l'ai fait, pas le choix, j'av pas le temps d'apprendre le C++), ca aurait ete le mauvais...
vouloir gagner en temps d'execution en choisissant le langage, dans des trucs haut niveau comme (par exemple) un scenegraph relativement complexe, un systeme de vertex/pixel shaders base sur des dll de shaders pluggables qui gere un bouncing automatique et transparent des shaders en fonction du hardware, ou pour plein d'autres trucs, essayer d'optimiser a ce niveau la est une pure perte de temps, et franchement ca m'etonne de toi![]()
pour ce genre de trucs, c'est beaucoup plus important d'avoir un haut niveau d'abstraction qu'un truc imbitable mais soit disant "optimise" qui te fera gagner au mieux 1 ou 2 fps sur 300... alors qu'en passant le temps que t'as perdu ici a approfondir d'autres parties beaucoup plus critiques tu pourrais en gagner 100...
c'est justement ca mon "ideal", comme mixer le C et l'asm sur Ti (que je n'ai jamais fait, je suis tjrs reste a l'asm mais bon), mixer le C et le C++ sur pc. tout ce qui est tres bas niveau en C voire avec des morceaux d'assembleur (par exemple, ce que je vais faire pour un occlusion culler en software en utilisant les instructions SSE), et tout ce qui est haut niveau en C++.
quoique je pense pas que je prenne bcp de risques en disant que tout pourrait etre fait en C++ & asm, en se passant de C, mais bon, la encore, c'est un point de vue uniquement en fonction du peu que j'ai vu du C++, donc j'ai sans doute tord mais je donne mon avis quand meme![]()
non merci, ca ferait a peu pres 60-70 libs statiques ou dynamiques pour l'instant, et au dessus de 150 a la fin![]()
c'est le genre de trucs inutiles dont on peut se passer, et voila un exemple parfait de tout le bordel que t'es oblige de faire pour avoir un (a peu pres) equivalent de ce que tu pourrais faire simplement en C++...
et le proj se decoupe deja en 5 grosses libs dynamiques et un (ou plusieurs executables), plus des tas de libs dynamiques pour chaque groupe de shaders. ca fait deja suffisemment usine a gaz comme ca![]()
EDIT: j'av pas vu le truc du un fichier par fonction, la on passe a l'autre extreme![]()
ca devient presque aussi ennervant a lire d'avoir un fichier par fonction que un fichier par module... sans compter le nombre de fichiers, et en plus pour le temps de compilation, par exemple pour une app win, si chaque fichier doit inclure windows.h, meme en ayant defini les WIN32_LEAN_AND_MEAN, et autres EXTRA_LEAN, le header est toujours relativement enorme, et c'est le preprocesseur qui prend plus de temps que le compilateur... donc t'augmente significativement le temps de compilation...
c'est pas une question d'effort bordel, c'est une question d'abstraction...
tvector_matmul_2x2_3x2_inverse_transpose(&a, b, c)
ou:
tvector_matmul_2x2_3x2_inverse_transpose_pointer_c(&a, b, &c) ?
ou encore:
tvector_matmul_2x2_3x2_inverse_transpose_pointer_b_pointer_c(&a, &b, &c) ?![]()
je dois sans doute avoir du mal a m'exprimer![]()
c'etait un exemple _simple_
vazy encapsule ca dans des fonctions, et compare les deux codes apres voir lesquels sont les plus lisibles et maintenables...
t_vector_4 truc, machin;
truc *= machin + truc * (machin / truc - machin * 2.0f) + 1.0f;
... et encore y a bien pire (dans un code de moteur physique non trivial par exemple...)
oui, et tu peux avoir une meilleure performance en changeant de facon de faire et en gardant une bonne portabilite... super non?
sBibi :
surtout que pour la maintenabilite du code, heu excuse moi mais... t'as des fonctions qui utilisent des multiplications de matrices 4*3 a pleins d'endroits, maintenant 3 mois apres tu decide de changer et d'utiliser des 4*4... si tu utilise l'overloading des operateurs et des fonctions, y a de grandes chances pour que t'aie quasiment rien a changer, si tu fais ca en C, t'as quasiment tout a changer... super
sBibi :
surtout que pour la maintenabilite du code, heu excuse moi mais... t'as des fonctions qui utilisent des multiplications de matrices 4*3 a pleins d'endroits, maintenant 3 mois apres tu decide de changer et d'utiliser des 4*4... si tu utilise l'overloading des operateurs et des fonctions, y a de grandes chances pour que t'aie quasiment rien a changer, si tu fais ca en C, t'as quasiment tout a changer... super
PpHd :
Ben alors ca prend 20 s. Que fais-tu en 20s ?
C'est pas inutile puisque ca evite les noms de collisions.
Et lorsque tu en as des tas a faire, le temps passe a le faire est negligeable devant les autres temps.
Exemple ?
Apprend a lire ce que j'ecris.
Une bonne architecture est assez independant du langage utilise. Donc...
Mixer l'assembleur et le C++ ? Ca sent les problemes a plein nez.![]()
Fait du C++. On en parlera apres.
Et alors ? make gere ca tres bien
Oue. Je crois que vous devriez tout jeter et reprendre a zero.
Tu me rappelles ces gars qui ont fait un serveur php en C++ avec des classes pour tout.
Tres beau en theorie. Inbuvable en pratique.
Pas forcement. Enfin perso maintenant je fais un fichier par fonction en C. Avec make ca marche plutot bien. En plus c'est simple a lire. Et tu n'as pas forcment besoin d'inclure windows.h a chaque fichier, ou alors c'est que l'app win est mal architecturee.
Ben regarde:
void vector_matmul_2x2_3x2(vector_t *a, const vector_t *b, const vector_t *c)
{
...
}
#define vector_matmul_2x2_3x2(a,b,c_ vector_matmul_2x2_3x2(&a,&b,&c)
C'est aussi mal de mettre trop de couches d'abstractions. Ca complexifie le code inutiliement.
Mais la n'est pas le probleme.
Lol. L'usine a gaz. Y'a pas de definition naturelle pour la division de deux vecteurs.
Vive l'abstraction C++. En plus c'est pas homogene... M'enfin ca se voit pas
![]()
C'est vraiment le genre de truc qu'il faudrait jeter du C++.
Encore plus usine a gaz ?
C'est que ton architecure etait mauvaise des le debut. Fallait mettre une couche d'abstraction intemediaire.
C'est aussi mal de mettre trop de couches d'abstractions. Ca complexifie le code inutiliement. Mais la n'est pas le probleme
En plus, Kevin te dirait qu'un bon IDE resoud ce genre de probleme rapidement.
sBibi :
c'est inutile pke en C++ il n'y aurait pas ce probleme....![]()
et le temps passe a faire _ca_ est peut etre negligeable, mais le temps passe a faire en C _tous_ les petits trucs que tu n'aurais pas a faire en C++ ne l'est pas...
exemple? t'en aura des _tas_ si tu vas voir les forums de prog de gamedev, ah mais j'oubliais, tu n'y va pas pke ils sont trop orientes C++? forcement si t'essaye pas de cotoyer des programmeurs C++ c'est pas etonnant que t'en connaisse aucun de bon![]()
ah oui, j'avais lu tu en gagne pas mal en temps d'execution![]()
bah pour temps de compilation, je prefere que ca mette un petit peu plus de temps a compiler mais que ca soit plus maintenable par une equipe de devs, et plus simple a reprendre plusieurs mois apres...
donc quoi? tu peux avoir la meme architecture en C que tu l'aurais en C++, mais avoir une implementation beaucoup plus obscure et/ou difficilement evolutive pour un des deux...
ah? pourquoi? j'ai vu ca etre fait assez souvent... c'est quoi les "problemes"?
lol c'est facile ca comme reponse![]()
je me tue a preciser a quasiment chacun de mes posts que quand je parle de C++ je ne peux parler que de ce que j'en ai vu, pas du langage dans sa totalite... et je me base aussi sur l'avis commun de la tripotee de devs de gamedev...
oue mais non... utiliser les libs statiques juste comme un "hack" pour contourner un pbl du C que le C++ n'a pas, non merci...
surtout que je sais pas si tu t'en rends compte mais quasiment tous les arguments que tu donnent rejoignent ce que j'ai dit tout au debut: le C oblige a utiliser pleins de ruses dans ce genre la pour faire ce que tu peux faire en C++, cf "emuler" des features C++ en C...
tu sais ce que c'est au moins pour te permettre de me dire de tout reprendre a 0?![]()
et meme si on voulait, on pourrait pas, on a une deadline en juillet...
et je ne vois pas en quoi je peux te rappeller qui ou quoi que ce soit, tu ne sait pas de quel projet je parle (en tout cas je vois pas comment tu pourrais le savoir...)
pour win.h: pas a chaque fichier non, sauf dans un module de gestion de fenetres ou t'as par exemple une structure privee qui est utilisee dans tout le module et qui contient des vars du style HWND ou autres oh bien sur tu peux te demmerder pour ne pas l'inclure a chaque fichier... mais a quel prix? et quel interet alors que tu pourrais eviter ca tres simplement?![]()
soit j'ai pas compris ton exemple, soit t'as pas compris le mien...
ptain mais c'est un exemple, c'est pas cense faire quoi que ce soit, c'est uniquement point de vue ecriture...
bon pas de divisions de vecteurs... okkk, remplace ca par des matrice et la div par une multiplication par l'inverse.. vala![]()
enfin ca depend de ce que t'appelle usine a gaz... moi j'appelle usine a gaz l'implementation en C, alors que l'implementation C++ est bcp plus claire, limpide, et met en valeur de facon bcp plus evidente les algos et formules utilisees...
ca revient tjrs au meme point, l'architecture est mauvaise ^^
tu sais, c'est bien beau de tout faire et prevoir sur papier, et puis de tout coder d'un seul coup sans bugs ou sans rien avoir a modifier qu'on n'avait pas prevu![]()
malheureusement c'est completement utopique pour des gros projets![]()
heu.. comment ca? O_o
A oue ? Perso pour les projets que j'ai fait:
20% : design de l'architecture.
30% : ecriture du code et du jeu de tests automatiques.
50% : debuggage et affinage des tests.
Mettons que tu prennes 10% de temps en + en C qu'en C++ pour ecrire (c'est vraiment enorme), ben ca fera que 3% sur le projet. Enfin, je peux me tromper.
Ben j'y vais pas, car je fais pas de jeux pour PC. Si tu veux je peux y aller.
Le caractere maintenable n'a rien a voir avec le langage.
En quoi est-elle plus obscure ?
Ton probleme est de vouloir faire du C++ en C. C'est pas la meme chose.
ABI non standardise. Sauf si tu fais des macros inlines
Ce qui ne fais pas ton avis. Donc j'attends ton avis a toi.
Ca n'a rien d'un hack, et tu n'es pas obblige de le faire.
Tous les arguments pour le C++ sont vraiment des broutilles.
J'ai une vague idee. Mais je sens que votre projet est mal parti.
Ben c'est tes commentaires sur ton projet qui me l'ont fait penser. c'est tout.
Si tu passez des vars HWND, c'est que ton programme est trop proche de windows et que tu devrais mettre une couche d'abstraction supplementaire
Faut simplifier la vie
Et alors ? C'est vraiment plus dur de faire appel aux fonctions ? Oui, un peu.
Moi j'appelle usine a gaz les programmes c++ que je trouve sur le net
Oui je sais.
mais si l'architecture change trop, il faut mieux tout reprendre. Beaucoup plus sain et au final plus rapide.
Ben Replace all.