./73: En C++, le preprocesseur, c'est mal
Pollux :
Raison de plus pour les laisser à 64 bits.
Moi non plus. Pkoi changer la taille des long long actuels alors qu'il n'y a aucune bonne raison de les faire passer à 128 bits ?
A part le cas où les pointeurs passeraient à 128 bits et où on aurait donc besoin d'un size_t de 128 bits et où ce serait donc envisageable que long long soit au moins un size_t (même si c pas obligatoire, hein), ou encore le cas où l'architecture du compilo serait extrêmement rigide et ne supporterait que 5 types entiers différents, je ne vois vraiment pas ce qui pourrait pousser à une telle décision.
PpHd
:Pollux :
Raison de plus pour les laisser à 64 bits.
A oui ? Et lorsque les long font 64 bits deja ? Ca ne sert a rien d'avoir les long long a 64 bits...
Un programme portable ne fait pas la supposition que long long = 64 bits...
Mais pourquoi appeler ça "long long" et pas "__int128" ? A moins que la portabilité n'entre pas du tout en ligne de compte, tous les progs actuels utilisant des "long long" vont prendre 2x plus de RAM et être 2x plus lents, sans rien gagner![]()
Le but est d'avoir des entiers allant jusqu'a 2^128 !!!!
Tu es vraiment bouche.
Et question portabilite tu peux etre sur que si une architecture survient et qu'elle a long long = 128 bits, ben la taille des long long ne sera pas le truc le plus dur question portabilite.
Moi non plus. Pkoi changer la taille des long long actuels alors qu'il n'y a aucune bonne raison de les faire passer à 128 bits ?On se demande deja pkoi ils font 64 bits alors que ca sert a rien sur une architecture 32 bits...
A part le cas où les pointeurs passeraient à 128 bits et où on aurait donc besoin d'un size_t de 128 bits et où ce serait donc envisageable que long long soit au moins un size_t (même si c pas obligatoire, hein), ou encore le cas où l'architecture du compilo serait extrêmement rigide et ne supporterait que 5 types entiers différents, je ne vois vraiment pas ce qui pourrait pousser à une telle décision.
Mais dans ce cas, ca serait plutot long qui passerait en 128 bits, mon cher![]()
Les long long feront alors 256 bits. Et de toute facon, les ptr ne passeront pas en 128 bits avant ~ 30 ans. (Et encore).
PpHd :
Je ne dis pas que les long long doivent imperativement faire 128 bits, je dis juste que ca serait bien.
Les types definis par stdint_t sont en fait des typedef des types existant. Pour definir int128_t, il faudrait definir un type natif au compilo compatible.
Si on reflechit 2s, on se rend compte que le seul mapping possible a l'heure actuelle est: char=1, short=2, int=4, long=8, long long=16.
Dans ce cas de mapping, le standard peut etre parfaitement respecte par la libc.
Pkoi 128 bits ? Car l'opteron permet de travailler en 128 bits a faible cout: add/adc sub/subc, et mul 64x64 -> 128 (x4)permet de se debrouiller pour faire un type 128 bits vraiment rapide compare a ce qu'on doit faire pour l'emuler en soft.
Toutes les donnees ne seront pas en long long, et je te signale que sur cette architecture, les long font deja 8 octets, et l'alignement est force a 8 octets. Tu comptes le nombre d'octets perdus a cause de cet alignement #newbies#
Le but des long long n'est pas d'etre rapide, et je te rappelle que question portabilite les long font deja 64 bits, donc tu peux faire une croix sur la portabilite de tes programmes.
Ensuite tu persistes a penser qu'un programme utilise des long long pour faire du calcul 64 bits. C'est faux. Un programme un minimum correct, utilise stdint.h et int64_t pour faire du calcul seulement 64 bits! C'est la seule maniere portable de faire du calcul 64 bits rapide. Tu as meme intfast64_t si tu preferes (Dans le cas ou faire des calculs en plus de 64 bits serait plus rapide).
On peut voir le type int comme le type d'entier primaire (alignement, vitesse optimal). Long comme l'equivalent avec les ptrs memoires. Et long long comme le type juste au dessus des possibilites de la machine. Certes c'est totalement faux, mais c'est comme ca que je vois les choses.
De toute facon, je n'ai aucun pouvoir sur ce genre de decisions.
Et je comprends pas pkoi tu dis que c'est hacker le systeme en mettant les long long sur une plate-forme 64 bits en 128 bits.
Et sur une architecture 128 bits, on aura les long long 64 bits, et les long 128 bits, c'est ca ? #couillon#
Je me demande a quel point tu me prends pour un con, et j'espere avoir ete assez mechant dans mon post sans depasser les regles de bonnes conduites.
PpHd :
>Types existants != types ANSI standard. C'est de toute façon non-standard pour le header de supposer qu'il y a un type entier 128 bits,
>donc le header sera forcément dépendant du compilo. A partir de là, le choix d'un type spécifique au compilo est préférable.
>Oui, mais rien n'oblige à prendre un mapping "type ANSI". Surtout qu'en plus on sera bien emmerdé le jour où on voudra faire du 256 bits...
1. ANSI est une norme americaine. 2. Elle correspond a la norme ISO C 89.
3. Cette norme ne possede pas de type "long long".
4. Le header definissant int128_t est FORCEMENT dependant du systeme/compilo ! C'est evident!
5. Mais stdint.h definit ce qu'il faut pour toi, donc tu n'as pas a definir ton type toi meme.
6. Evidement tu devras attendre la revision du standard possedant int128_t. 7. Sauf que intmax_t peut tres bien etre egal a 128 bits (ou long long), sans enfeindre le standard.
>Je veux bien que le surcoût de calcul soit faible sur certaines archi, mais il n'empêche qu'il reste le pb de la RAM et du débit mémoire. Mais si on a besoin de calculer en 128 bits, le pb de la RAM et du debit memoire resteront, meme si long long = 8.
>Alors je suis neuneu. Si tu veux un type 128 bits sur un Opteron, ben ça prend 2x plus de place, je suis désolé. Pareil pour la bande passante. Parce que tu penses que tous les types utilises seront des long long ?
Parce que les opcodes des instructions sont codes avec des long long ?
>Ca serait un désastre au niveau performance : p-ê qu'on pourrait lire les données 2x+ vite (en fait un peu moins), mais en même tps la moitié des données serait inutile. On disait la meme chose au passage du 16 au 32 bits, et du 32 au 64 bits...
>Donc mon parallèle avec la taille des pointeurs est bien pertinent : on a toutes les raisons du monde de croire que le type 64 bits sera plus efficace au niveau taille que n'importe quel type plus gros. C'est bien d'enoncer des evidences, mais ca ne fait pas avancer le debat... que dis-je ? Le double-monologue.
>Je ne connaissais pas intfast64_t, qui correspond effectivement à peu près à mon idée du "long long". Mais je ne vois alors plus l'intérêt du "long long" ?
On se calme.
intfast64_t est definie (conditionnellement) par la libc en fonction des types supportes par ton compilateur. "long long" est un type definie par GCC, contrairement a intmax_t et co qui sont definies par la libc.
> Si on suit ton raisonnement il faut que long long fasse 256 bits sur opteron ? Nan, 128 bits.
>En tout cas comme je l'ai dit ce raisonnement ne pourra certainement pas se prolonger à l'infini, puisqu'on a que 5 types de base... Non bien sur.
>Et prendre des définitions qui varient autant selon les plateformes, ça me paraît un peu bizarre... C'est pour ca que stdint.h a ete cree.
>En plus je crois que certaines architectures 64bits font du 16/32/32/64 avec des ptr 64 bits, donc ça ne colle pas trop avec ton idée du long long... (ou alors on n'aurait pas "de base" un type entier 64 bits) Lesquelles ? C'est pas des alphas, pas des ia64, pas des amd64, pas des sparck64 (leger doute pour sparck64). Donc ?
>Parce que si un prog utilise effectivement les 64 bits de poids fort de ton long long 128 bits, il ne sera pas portable.
Parce qu'un programme utilisant les 16 bits de poids fort d'un int est portable ? Le but des types d'un compilo n'est pas d'etre portable. stdint.h existe !
Les objets de type int tout cours prennent la taille naturelle des nombres pour l'architecture de la machine utilisée ; les autres tailles (NDG: les short int et long int) permettent de répondre à des besoins particulier. La taille mémoire des entiers longs est au moins égale à celle des entiers cours, mais c'est l'implémentation qui détermine si les entiers ordinaires (NDG: les int) sont long ou courts.
inline long long mul(long x, long x) {return (long long) x * y; }
PpHd :
1. ANSI est une norme americaine. 2. Elle correspond a la norme ISO C 89.
6. Evidement tu devras attendre la revision du standard possedant int128_t.
Pollux
:>En plus je crois que certaines architectures 64bits font du 16/32/32/64 avec des ptr 64 bits, donc ça ne colle pas trop avec ton idée du long long... (ou alors on n'aurait pas "de base" un type entier 64 bits) Lesquelles ? C'est pas des alphas, pas des ia64, pas des amd64, pas des sparck64 (leger doute pour sparck64). Donc ?
Oh, c'est une architecture pas très connue, et qui va certainement faire un flop : Windows 64 bits(j'avais pas donné de nom parce que j'étais pas trop sûr, mais je viens de vérifier sur MSDN)
Godzil :
tiens j'ai trouvé un truc interessant dans la définition du C89 :
Les objets de type int tout cours prennent la taille naturelle des nombres pour l'architecture de la machine utilisée ; les autres tailles (NDG: les short int et long int) permettent de répondre à des besoins particulier. La taille mémoire des entiers longs est au moins égale à celle des entiers cours, mais c'est l'implémentation qui détermine si les entiers ordinaires (NDG: les int) sont long ou courts.
PpHd
: Mon mal a la tete prend des proportions gigantesques.
>Mais si tu demandes que intmax_t >= 128 bits, tu enfreinds le standard. Donc autant prendre un int128_t, si ton système le propose... Aucun systeme ne le propose. Mais tu peux le verifier avec un configure.
>Oh, c'est une architecture pas très connue, et qui va certainement faire un flop : Windows 64 bits Quelle version ? Et est-ce quelle compile au moins en mode natif 64 bits ?
En tout cas, ca fait une raison de plus de ne pas prendre windows, puisqu'on peut pas faire de cross-multiplication 64x64 -> 128.inline long long mul(long x, long x) {return (long long) x * y; }Au lieu de ca tu dois faire 4 produits 32x32 -> 64. Vraiment puissant, alors que ca existe dans le proc.
(Remarque je comprends pkoi ils ont choisi ca: pour continuer de faire tourner les programmes buggues.).
>Donc pkoi ne pas s'en servir et pkoi "casser" les progs existants ? (entendre : les ralentir) Les progs existant utilisant stdint.h comme ils le doivent ne seront pas ralentis.
>(j'avais pas donné de nom parce que j'étais pas trop sûr, mais je viens de vérifier sur MSDN) Adresse ?
In 64-bit Microsoft® Windows®, this assumption of parity in data type sizes is invalid. Making all data types 64 bits in length would waste space, because most applications do not need the increased size. However, applications do need pointers to 64-bit data, and they need the ability to have 64-bit data types in selected cases. These considerations led the team to select an abstract data model called LLP64 (or P64). In the LLP64 data model, only pointers expand to 64 bits; all other basic data types (integer and long) remain 32 bits in length.
>* parce que je présume que les Unix qui utilisent des int 32 bits sont antérieurs à ANSI Linux est sorti apres la norme ISO-C89 et suppose que les int == 32 bits.
>Mais je te parle des trucs existants qui utilisent des long long.
Donc le programmeur n'a pas demande un type de 64 bits mais un type d'au moins 64 bits. S'il voulait un intfast64_t, il l'aurait demande, non ?
Mais j'ai l'impression que tu confonds programmation portable == programmation portable pour les windows...
>Sauf qu'un compilo a en plus des impératifs comme compiler n'importe quel prog, pas que les tiens : et si il adopte long long=16, tous les progs existants utilisant intensivement des calculs 64 bits deviendront 2x plus lents et gourmands en RAM. S'ils utilisent des long long, c'est qu'ils voulaient faire des calculs en precisions d'au moins 64 bits. Et ils seront content d'avoir plus de precisions que 64 bits.
>Le modèle "5 types ISO surjectifs mappés en des alias" n'est clairement pas satisfaisant, donc je ne vois pas pkoi retarder d'une génération. Ca peut etre plus complexe. Utiliser des attributs de GCC pour augmenter la precision des long par exemples.
>Et ? Cette séparation est parfaitement arbitraire... Non, car ils ne doivent pas etre definis si on n'inclut pas stdint.h.
>Bah non, puisque c'est "dans" les capacité du proc et pas "au-dessus" ... Nan, c'est juste au-dessus de ce qu'il peut faire.
>Je me place dans le cas (suggéré par tes posts) où c'est une application gourmande de calculs entiers (mais qui n'a besoin que de 64 bits) Une telle application utilise donc intfast64_t.
>Je te dis qu'un alignement plus grand (genre 128 bits) serait une catastrophe. On n'en ait pas encore la.
>Alors que si les données à manipuler sont grosses et qu'on ne peut pas s'arranger pour faire tenir ça dans le cache, c'est la BP mémoire qui sera limitante. Et le code sera 2x plus lent. Je vais perdre mon calme. Pas si l'application utilise intfast64_t comme elle le fait si elle voulait utiliser des types de 64 bits!
Mais je me demande pkoi je continue a discuter avec quelqu'un qui veut que long = 4 long long = 8, alors que ce n'est pas impose par le standard, et qu'aucune application ne doit supposer que long long est la maniere la plus rapide de faire du calcul 64 bits.
PpHd :
>N'importe quoi. inline __int128 mul(__int64 x,__int64 y) { ... } (sauf que je pense pas que __int128 soit géré pour l'instant) Vachement portable.
Kevin Kofler
:Godzil :
tiens j'ai trouvé un truc interessant dans la définition du C89 :
Les objets de type int tout cours prennent la taille naturelle des nombres pour l'architecture de la machine utilisée ; les autres tailles (NDG: les short int et long int) permettent de répondre à des besoins particulier. La taille mémoire des entiers longs est au moins égale à celle des entiers cours, mais c'est l'implémentation qui détermine si les entiers ordinaires (NDG: les int) sont long ou courts.
Ceci est faux. Un int n'est pas forcément short ou long, il peut être entre les deux, ce qui est le cas pour le LP64.
"Le language C norme ANSI"
de Brian W. Kernighan et Denis M.Ritchie
C'est kernighan et ritchie qui ont ecrit ce texte !
[#8] For any two integer types with the same signedness and different integer conversion rank (see 6.3.1.1), the range of values of the type with smaller integer conversion rank is a subrange of the values of the other type.
-- The rank of long long int shall be greater than the rank of long int, which shall be greater than the rank of int, which shall be greater than the rank of short int, which shall be greater than the rank of signed char.