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

  FORUM HardWare.fr
  Programmation
  C++

  [C++/résolu] donnée static const Pi=3.14

 


 Mot :   Pseudo :  
 
 Page :   1  2
Page Précédente
Auteur Sujet :

[C++/résolu] donnée static const Pi=3.14

n°1343482
nargy
Posté le 10-04-2006 à 20:19:25  profilanswer
 

Bonjour à tous,
 
Je viens d'installer la dernière version de mon compilo, et alors qu'avant j'utilisais des données static const, j'obtient maintenant une erreur à l'édition des liens. Par contre, dans le flot global ça fonctionne toujours:

Code :
  1. class Test
  2. {
  3.   public:
  4. // test.C:(.text+0x1e): undefined reference to `Test::Pi'
  5.   static const float Pi=3.14;
  6. };
  7. // ok
  8. static const float Pi=3.14;

Comment faire pour créer une constante inline propre à une classe?
 
Merci d'avance  :jap:
 
Réponse: C++ n'accepte que les entiers initialisés dans la classe.
 
Solutions alternatives:
- simple: un bon vieux #define
- style C: mettre la constante au dehors de la classe
- optimisé: regrouper toutes les constantes dans une même union de structures, afin d'améliorer l'utilisation du cache du processeur. (merci à tbp pour cette solution)
- longue: attendre que la norme C++ évolue  :D
En addition:
- plus optimisé: ne pas utiliser de compilation séparée.
[:m@nu68]


Message édité par nargy le 11-04-2006 à 23:39:16
mood
Publicité
Posté le 10-04-2006 à 20:19:25  profilanswer
 

n°1343491
skelter
Posté le 10-04-2006 à 20:28:02  profilanswer
 

Test:: Pi est externe et non-définie (quoiqu'il me semble que quand tu l'initialises dans la définition de la classe elle est lié statiquement et donc ca devrai compiler)
Pi est static et est définie
 
tu dois définir Test:: Pi dans un .cpp
 
const float Test:: Pi=3.14;

Message cité 1 fois
Message édité par skelter le 10-04-2006 à 20:28:21
n°1343496
skelter
Posté le 10-04-2006 à 20:31:37  profilanswer
 

skelter a écrit :

(quoiqu'il me semble que quand tu l'initialises dans la définition de la classe elle est lié statiquement et donc ca devrai compiler)
Pi est static et est définie


 
chez moi ca compile et ca lie (g++ 3.4)

n°1343503
nargy
Posté le 10-04-2006 à 20:35:15  profilanswer
 

g++4.0.1
j'ai peut être abusé sur l'upgrade alors...???

n°1343513
nargy
Posté le 10-04-2006 à 20:40:57  profilanswer
 

trop de la balle, il y a -fno-threadsafe-statics (donc l'inverse aussi).
ça ne résoud pas mon problème.
Si ++fab passe par là, il me dira p-e, il utilise gcc4 il me semble.

n°1343526
skelter
Posté le 10-04-2006 à 20:53:16  profilanswer
 

en fait je crois que sur une vieille version (<3) ca ne passait pas l'édition des lien, sur la 3.4 ca passe et à nouveau plus sur la 4
 
le comportement le plus proche du standard est celui de g++ 4, en fait on peut initialiser directement dans la définition de la classe seulement si la variable static constante est entiere

n°1343618
nargy
Posté le 10-04-2006 à 22:31:35  profilanswer
 

> si la variable static constante est entiere
oui, ok, je vois, j'ai dû lire ça quelquepart
c'est quoi la raison au fait?

n°1343641
skelter
Posté le 10-04-2006 à 23:03:56  profilanswer
 

aucune idée, ce n'est pas expliqué dans le stroustrup ni dans le standard

n°1343645
++fab
victime du syndrome IH
Posté le 10-04-2006 à 23:07:30  profilanswer
 

Ni dans le D&E :/  

n°1343663
skelter
Posté le 10-04-2006 à 23:23:15  profilanswer
 

ni sur cpptips, bs renvoi direct à son livre
http://cpptips.hyperformix.com/cpp [...] tatic_init

mood
Publicité
Posté le 10-04-2006 à 23:23:15  profilanswer
 

n°1343666
nargy
Posté le 10-04-2006 à 23:28:17  profilanswer
 

Ok, prise de tête quoi.
Je vais mettre le sujet en ``irrésolvable`` [:rofl]
En attendant, je vais utiliser des variables globales, voire un #define.

n°1343668
skelter
Posté le 10-04-2006 à 23:31:06  profilanswer
 

qu'est-ce qui t'empeches de la définir dans un .cpp ?

n°1343670
nargy
Posté le 10-04-2006 à 23:31:40  profilanswer
 

parceque je la veux inline ma constante.

n°1343675
skelter
Posté le 10-04-2006 à 23:35:25  profilanswer
 

je ne penses pas qu'il puisse y avoir de différence au niveau du code généré, en fait pourquoi il y en aurait ?

n°1343676
++fab
victime du syndrome IH
Posté le 10-04-2006 à 23:35:44  profilanswer
 

constante inline, ça n'a pas de sens.  
ça n'en aura jamais -- je dis ça par ce qu'il y a eu jadis un proposal la dessus mis aux oubliettes.

n°1343682
nargy
Posté le 10-04-2006 à 23:47:36  profilanswer
 

ben, si je déclare par exemple:
lib.h:
static int a;
lib.cpp:
int a=0;
 
en ASM il va me chercher l'adresse de la constante, la charger dans un registre, et l'utiliser
 
si je met:
#define A 0
 
il va me mettre un ``xor eax,eax`` tout bête et 10 fois plus rapide.
 
moins efficace avec d'autre valeurs, mais même principe.

n°1343689
++fab
victime du syndrome IH
Posté le 10-04-2006 à 23:56:14  profilanswer
 

La même avec static int const a, en compilation optimisée ?  
 
et même sans utiliser de compilation optimisée, les "static const" sont quasi toujours optimisés.

Message cité 1 fois
Message édité par ++fab le 10-04-2006 à 23:57:06
n°1343693
skelter
Posté le 11-04-2006 à 00:00:32  profilanswer
 

+1, le compilateur ne peut pas deviner la constance de a, il faut la lui communiquer et le mot-clef const est la pour ca
 
et puis dans un programme un minimun complexe ces optimisations seront "silencieuses", ne sacrifie pas la structure de ton code au profit d'optimisations subtentielles qui n'aurait sans doute pas lieu d'etre si tu faisais les choses dans l'ordre (une fois le programme terminé, en se basant sur les informations de profilage)

n°1343695
skelter
Posté le 11-04-2006 à 00:01:45  profilanswer
 

++fab a écrit :


les "static const" sont quasi toujours optimisés.


 
les "const" plus généralement ?

n°1343701
nargy
Posté le 11-04-2006 à 00:10:17  profilanswer
 

> (une fois le programme terminé, en se basant sur les informations de profilage)
- je vais pas attendre le profilage pour me rendre compte que j'utilise minimum 1Mega*25 fois cette constante par seconde.
 
> et même sans utiliser de compilation optimisée, les "static const" sont quasi toujours optimisés.
- tu m'explique comment le compilo fait pour optimiser une constante dans un .cpp quand tu lui donne le .h? ou tu m'explique comment le linker fait pour optimiser cette même constante là où il faut sans les sources.

n°1343704
skelter
Posté le 11-04-2006 à 00:17:03  profilanswer
 

Citation :

- je vais pas attendre le profilage pour me rendre compte que j'utilise minimum 1Mega*25 fois cette constante par seconde.


 
elle sera placée dans un registre ou en cache, j'imagine, dans la mesure ou le compilateur dispose des informations necessaires
 

Citation :


- tu m'explique comment le compilo fait pour optimiser une constante dans un .cpp quand tu lui donne le .h? ou tu m'explique comment le linker fait pour optimiser cette même constante là où il faut sans les sources.


 
idem, il en connait l'adresse et pourra généré le code pour la placer en registre par exemple, mais c'est sur qu'il ne pourra pas l'inserer dans le code mais ca c'est pratiquement invisible comme optimisation
 
tu pourrait pas nous montrer un exemple avec et sans qu'on puisse tester pour voir la différence de performance ?

n°1343706
chrisbk
-
Posté le 11-04-2006 à 00:18:09  profilanswer
 

nargy a écrit :

ben, si je déclare par exemple:
lib.h:
static int a;
lib.cpp:
int a=0;
 
en ASM il va me chercher l'adresse de la constante, la charger dans un registre, et l'utiliser
 
si je met:
#define A 0
 
il va me mettre un ``xor eax,eax`` tout bête et 10 fois plus rapide.
 
moins efficace avec d'autre valeurs, mais même principe.


 
ouais sauf qu'en float, y'a pas de constante [:chrisbk] (a part 0 et 1)
 


Message édité par chrisbk le 11-04-2006 à 00:18:48
n°1343712
nargy
Posté le 11-04-2006 à 00:31:34  profilanswer
 

Pi c'est pour exemple, mes constantes sont des coordonnées polaires sur 6+1 plans:
Real AlphaMin=-1;
Real AlphaMax=1;
Real BetaMin=-1;
Real BetaMax=1;
int GammaMin=0;
int GammaMax=5;
int GammaNull=-1;
avec Real=float,double ou long double
 
non, sérieux, si je dis que j'ai besoin de constantes inline, c'est que j'en ai vraiment besoin. ça veux peut être rien dire en C++ une constante inline, mais c'est assez explicite sur ce que j'ai besoin.
 
Si vous avez autre chose d'équivalent, je prends, mais moi je connais pas...
 
Pour les tests de prefs, je veux bien, mais je sens que ça va encore être prise de tête, et finalement on aura pas toutes les réponses que l'on attends comme avec le coup des pointeurs de fonctions/fonctions virtuelles.
 
Et finalement, d'expérience, les compilos ils optimisent jamais comme on imagine. Là je peut pas faire mieux qu'installer gcc4.
 
Aller, vous conaissez les concepteurs de quake, ils ont pour devise:

Citation :


La meilleure des optimisations s'effectue entre vos oreilles.


Moi, je prends.

n°1343723
nargy
Posté le 11-04-2006 à 00:50:04  profilanswer
 

Enfin, merci de vos conseils.
Je les prends tout de même en compte, je les utiliserai sûrement dans d'autres parties de code.
 
Merci.

n°1343730
nargy
Posté le 11-04-2006 à 01:48:23  profilanswer
 

Bon ok, voilà le listing ASM avec gcc4 -O2 et Real=double:

Code :
  1. #----------------- define ---------------
  2. movl $1374389535, %ebx
  3. movl $1074339512, %esi
  4. pushl %esi
  5. pushl %ebx
  6. pushl $.LC1
  7. call printf
  8. #----------------- static const ---------------
  9. movl $1374389535, %ebx
  10. movl $1074339512, %esi
  11. pushl %esi
  12. pushl %ebx
  13. pushl $.LC1
  14. call printf
  15. #----------------- class static const ---------------
  16. movl _ZN4Test2PiE+4, %edx
  17. movl _ZN4Test2PiE, %eax
  18. pushl %edx
  19. pushl %eax
  20. pushl $.LC1
  21. call printf

``define`` et ``static const`` utilisent le prefetch, et ``class static const`` peut utiliser le cache sauf si le segment de donnée est trop gros (ce qui est le certainement cas dans mon programme, ainsi que pour le segment de code).
Quelques cycles de différence.
Edit: testé avec pi=3.14


Message édité par nargy le 11-04-2006 à 01:51:34
n°1344307
tbp
Posté le 11-04-2006 à 16:56:55  profilanswer
 

Suivant ta platforme et les options, gcc va p-e essayer de regrouper les constantes similaires de toute façon (pooling).
 
J'ai du mal a saisir ce que tu veux vraiment obtenir in fine: un fldpi? chargement par immediats (movl $1374389535, %ebx; movl $1074339512, %esi; push; push)? reference memoire?
 
Pour ma part, quand j'ai des 'constantes' re-utilisable qui trainent, plutot que d'esperer que le compilo/linker les regroupent, je les colle explicitement dans une meme section R/O: j'ai comme ça une ligne de cache chaude avec plusieurs de ces constantes sous le coude.
 
Le seul probleme c'est d'obtenir que ces constantes ne soient pas construites, ce qui n'est pas forcément évident.
Par exemple & flemme voici ce que j'utilise pour des 'packed scalars'; fonctionne avec gcc et msvc.
 
D'abord une union pour enrober le tout et prodiguer la magie necessaire pour eliminer les constructeurs, tout est dans l'utilisation d'entiers comme premier champs.

Code :
  1. union wrapper_t {
  2.  struct { int32_t i0,i1,i2,i3; };
  3.  struct { float32_t f0,f1,f2,f3; };
  4.  __m128  v;
  5.  __m128i  i;
  6.  float32_t s;
  7.  FINLINE operator const __m128 &()  const { return v; }
  8.  FINLINE operator const __m128i &()  const { return i; }
  9.  FINLINE operator const float &()  const { return s; }
  10. };


 
Puis la declaration du contenu de la section, aussi visible de tous.

Code :
  1. extern const struct section_t {
  2.   wrapper_t
  3.    plus_inf,
  4.    // mostly used for NR refinements.
  5.    three,
  6.    one,
  7.    half;
  8. } section;


 
Enfin, qque part dans un coin obscur, la definition des valeurs.

Code :
  1. #ifdef __MSVC__
  2.   #pragma const_seg(push, pristine, "PIPOBIMBO" )
  3.   const section_t section =
  4. #else // gcc
  5.   const section_t section  __attribute__((section ("PIPOBIMBO" ))) =
  6. #endif
  7.  {
  8.   {{ 0x7f800000, 0x7f800000, 0x7f800000, 0x7f800000 }}, // +inf
  9.   {{ 0x40400000, 0x40400000, 0x40400000, 0x40400000 }}, // 3.f
  10.   {{ 0x3f800000, 0x3f800000, 0x3f800000, 0x3f800000 }}, // 1.f
  11.   {{ 0x3f000000, 0x3f000000, 0x3f000000, 0x3f000000 }}, // .5f
  12.  };


 
On est d'accord c'est un peu ampoulé. Mais on obtient une section R/O cacheable à souhait remplie de constantes triées sur le volet.
Et une section PIPOBIMBO dans un binaire, ça le fait. Non?

n°1344353
nargy
Posté le 11-04-2006 à 17:47:11  profilanswer
 

> J'ai du mal a saisir ce que tu veux vraiment obtenir in fine: un fldpi? chargement par immediats (movl $1374389535, %ebx; movl $1074339512, %esi; push; push)? reference memoire?
 
Le plus rapide possible, pour un bloc de donnée qui ne tient pas dans le cache entièrement, et un bloc de code non plus. Je ne connais pas assez bien l'assembleur des pentiums, mais il me semble que mettre les constantes directement dans le bloc de code avec movl $1074339512, %esi .. est le plus rapide dans ce cas, puisque est mis en prefetch.
 
> Et une section PIPOBIMBO dans un binaire, ça le fait. Non?
je ne connais pas le terme PIPOBIMBO. Le code assembleur que j'ai montré plus haut est fait par le compilo GCC4, sur un programme qui fait un printf() des constantes (d'où les pushl). En fait, ce que je cherche c'est à optimiser au max, sans mettre de l'assembleur dans le code C++. Si je comprends bien, tu fait une double déclaration avec union d'entiers et de flottant, j'utilise ça aussi dans d'autres parties de code (par ex. extraire l'exposant binaire d'un nombre réel sans utiliser frexp de math.h). Mais pour mes constantes je préfère laisser le compilo faire les optimisations necessaire s'il s'agit de traiter des flottant comme des entiers, car je compte compiler mon programme avec plusieurs tailes de flottants (float,double,long double) (au moins pour tester). Celà m'obligerai à utiliser des #define trop souvent. Comme derrière j'ai des structures de données (très) complexes je ne préfère pas alourdir encore le code.
 
Je pense, mais peut être à tord, que dans ces conditions un movl avec une constante en paramètre permet dans un cas général d'avoir une meilleure optimisation que d'avoir des constantes accesibles par déréférences. Le compilo s'arrange pour garder en registre les constantes si c'est possible, et il génère de nouvelle constantes (comme par ex. (min+max)/2.0) sans instruction supplémentaire.
 
De plus, je n'utilise jamais, mais alors jamais jamais, d'identificateurs avec '_' devant, et encore moins '__'. Ces identificateurs sont sujets à changement dans d'autre versions de librairies, de compilo ou de système. C'est trop le bordel, quoi. Ceci dit, je comprends que dans certains cas celà permet de coller au mieux à la plateforme.
 
mov (constante, registre) est le plus rapide, je me trompe?

n°1344379
tbp
Posté le 11-04-2006 à 18:39:11  profilanswer
 

nargy a écrit :

> J'ai du mal a saisir ce que tu veux vraiment obtenir in fine: un fldpi? chargement par immediats (movl $1374389535, %ebx; movl $1074339512, %esi; push; push)? reference memoire?
 
Le plus rapide possible, pour un bloc de donnée qui ne tient pas dans le cache entièrement, et un bloc de code non plus. Je ne connais pas assez bien l'assembleur des pentiums, mais il me semble que mettre les constantes directement dans le bloc de code avec movl $1074339512, %esi .. est le plus rapide dans ce cas, puisque est mis en prefetch.


Sauf que dans le cas des flottants, sur x86, il n'y pas moyen de charger des immédiats directement sur la pile de la fpu; si tu passes par un GPR, avec par exemple movl $1074339512, %esi, il faudra ensuite l'écrire qque part et charger ça sur la pile.
Je simplifie un peu, il y a des exceptions  http://enrico.phys.cmu.edu/QCDclus [...] /vc102.htm d'ou mon allusion à fldpi. Ca ne s'arrange pas avec SSE.
 
De toute façons gcc est parfaitement au courant de toutes ces nuances d'encodage.
Ensuite la bande passante de decodage, que tu essaies de transiger, est une denrée rare.
 

nargy a écrit :

> Et une section PIPOBIMBO dans un binaire, ça le fait. Non?
je ne connais pas le terme PIPOBIMBO. Le code assembleur que j'ai montré plus haut est fait par le compilo GCC4, sur un programme qui fait un printf() des constantes (d'où les pushl). En fait, ce que je cherche c'est à optimiser au max, sans mettre de l'assembleur dans le code C++. Si je comprends bien, tu fait une double déclaration avec union d'entiers et de flottant, j'utilise ça aussi dans d'autres parties de code (par ex. extraire l'exposant binaire d'un nombre réel sans utiliser frexp de math.h). Mais pour mes constantes je préfère laisser le compilo faire les optimisations necessaire s'il s'agit de traiter des flottant comme des entiers, car je compte compiler mon programme avec plusieurs tailes de flottants (float,double,long double) (au moins pour tester). Celà m'obligerai à utiliser des #define trop souvent. Comme derrière j'ai des structures de données (très) complexes je ne préfère pas alourdir encore le code.


Non, tu te méprends sur la finalité de mon union. Comme précisé dans le post précédent cette union ne sert qu'a s'assurer de l'abscence de constructeurs à l'initialization de mes constantes.
Si le compilateur produit un constructeur, par définition il ne peut déposer mes constantes dans une section Read-Only, or c'est la l'objet de toutes ces contortions.
 
Comme expliqué précedement le seul moyen de generer des constantes en flottant c'est:
a) de les charger depuis la mémoire.
b) de les calculer d'une façon ou d'une autre.
 
Gcc et le linker vont de toute façon essayer de regrouper toutes les constantes, je prend juste les devants et m'assurant de leur unicité et de leur cacheabilité.
 

nargy a écrit :


Je pense, mais peut être à tord, que dans ces conditions un movl avec une constante en paramètre permet dans un cas général d'avoir une meilleure optimisation que d'avoir des constantes accesibles par déréférences.


Ton modele de coût est bien trop simpliste et de toute façon, encore une fois, c'est techniquement impossible pour des flottants sur un x86.

n°1344388
Taz
bisounours-codeur
Posté le 11-04-2006 à 18:50:07  profilanswer
 

nargy a écrit :

> si la variable static constante est entiere
oui, ok, je vois, j'ai dû lire ça quelquepart
c'est quoi la raison au fait?


sans doute à cause d'une difficulté d'implémentation quelconque pour les <pas types entiers>. C'est proposé pour 0x de supporter les constantes littérales flottantes.

n°1344394
Taz
bisounours-codeur
Posté le 11-04-2006 à 18:56:18  profilanswer
 

sinon, on rêve tous de constantes extern inlinées dès possibles :/ Faut faire son deuil : ou multiple définitions, ou bien payer un petit prix à l'accès . J'ai récemment gagner 17k de .text et bien 4k de .data en virant la définition d'une
namespace Foo { const string TAG("foo" ); } hors du .hpp en faveur d'un extern const. Ce const était d'autant plus dommageable, que pour chaque .cpp incluant le .hpp, bam, une instance de TAG ... même si personne n'utilise ...

n°1344437
nargy
Posté le 11-04-2006 à 20:09:44  profilanswer
 

Merci pour vos commentaire, ça m'aide beaucoup.
 
tbp>
ok, c'est noté, pour les affectations de flottants. je me faisait une fausse idée sur la question. je vais étudier ce lien.
 
> De toute façons gcc est parfaitement au courant de toutes ces nuances d'encodage.
ouf, tant mieux! :)
 
> Ensuite la bande passante de decodage, que tu essaies de transiger, est une denrée rare
- Là encore je dois me faire une fausse idée, de ce que j'ai vaguement lu.
 
> cette union ne sert qu'a s'assurer de l'abscence de constructeurs à l'initialization
- ok, j'imagine que c'est plus efficace sans présumer des capacités du compilateur et des options de compil.
 
> je prend juste les devants et m'assurant de leur unicité et de leur cacheabilité.
- ok, je comprends
 
mais j'aurai quand même une question: comment fonctionne le cache? je ne demande pas une réponse exhaustive, mais si vous avez un lien sur une doc, ou quelques recommandations. J'ai toujours considéré que pour un code trop long ou des données trop fournies les optimisations par cache devenaient secondaires, dû à la saturation du cache.
 
taz>
> C'est proposé pour 0x de supporter les constantes littérales flottantes.
cool :)
 
> sinon, on rêve tous de constantes extern inlinées dès possibles :/
- :lol: ouais, faut faire le deuil.
 
> J'ai récemment gagner 17k de .text et bien 4k de .data en virant la définition d'une
namespace Foo { const string TAG("foo";); }
- à mon avis, l'optimisation sur les chaînes de caractères, il faut faire le deuil aussi ;) la plupart du temps, quand j'utilise des chaînes, c'est pas dans une optique de performances. Le moindre printf te bouffe tout les cycles que tu peut économiser. Et ça doit saturer le cache.

n°1344438
nargy
Posté le 11-04-2006 à 20:12:29  profilanswer
 

trop fort ce lien!
on peut utiliser FLD1 pour -1.0, en bidouillant la pile?

n°1344439
Taz
bisounours-codeur
Posté le 11-04-2006 à 20:14:42  profilanswer
 

nargy a écrit :


> J'ai récemment gagner 17k de .text et bien 4k de .data en virant la définition d'une
namespace Foo { const string TAG("foo";); }
- à mon avis, l'optimisation sur les chaînes de caractères, il faut faire le deuil aussi ;) la plupart du temps, quand j'utilise des chaînes, c'est pas dans une optique de performances. Le moindre printf te bouffe tout les cycles que tu peut économiser. Et ça doit saturer le cache.


que ce soit une string, ça n'est que pour l'exemple. dès que tu as un objet pas POD, ben il faut faire attention

n°1344443
nargy
Posté le 11-04-2006 à 20:18:30  profilanswer
 

> dès que tu as un objet pas POD, ben il faut faire attention
- ouais
- qui confirme l'utilité de l'union de Tbp.

n°1344444
tbp
Posté le 11-04-2006 à 20:20:54  profilanswer
 

Taz a écrit :

sinon, on rêve tous de constantes extern inlinées dès possibles :/ Faut faire son deuil : ou multiple définitions, ou bien payer un petit prix à l'accès .


Non, non et non. Il n'y a rien de gratuit en ce bas monde. Si une constante est 'inlinée' comme vous dites, au lieu d'un accès mémoire explicite vous payez pour de la bande passante de decodage car l'instruction requiert plus de place pour etre encodée. Savoir si cela est un gain ou non requiert de prendre en compte un peu plus de facteurs.
Encore une fois un compilo comme gcc 4.x est parfaitement à meme d'effectuer ce genre de transformation de lui meme. Encore faut-il pour cela exposer les choses clairement.
 

Taz a écrit :


J'ai récemment gagner 17k de .text et bien 4k de .data en virant la définition d'une
namespace Foo { const string TAG("foo" ); } hors du .hpp en faveur d'un extern const. Ce const était d'autant plus dommageable, que pour chaque .cpp incluant le .hpp, bam, une instance de TAG ... même si personne n'utilise ...


Ca n'a strictement rien a voir.

n°1344448
++fab
victime du syndrome IH
Posté le 11-04-2006 à 20:24:42  profilanswer
 

nargy a écrit :

taz>
> C'est proposé pour 0x de supporter les constantes littérales flottantes.
cool :)


Ah, je n'en vois aucunes traces :|  
J'apprécierai (vu mon état de fatigue), un lien vers le proposal en question :)

n°1344451
Taz
bisounours-codeur
Posté le 11-04-2006 à 20:28:51  profilanswer
 

1) pas d'accord du tout. Et puis ça coute peut etre plus cher sur ton x86, pas ailleurs. Je vois pas plus court qu'un li ... l'inline de constantes permet très souvent de propager d'autres optimisations. Montre moi comment gcc peut optimiser a + b avec a et b extern const int ...
 
2) au contraire si.
et puis tu nous fais le parano niveau cache ... alors poursuis ton raisonnement

n°1344452
Taz
bisounours-codeur
Posté le 11-04-2006 à 20:29:22  profilanswer
 

++fab a écrit :

Ah, je n'en vois aucunes traces :|  
J'apprécierai (vu mon état de fatigue), un lien vers le proposal en question :)


bon je commence ma recherche ...

n°1344456
Taz
bisounours-codeur
Posté le 11-04-2006 à 20:33:44  profilanswer
 

tiens ça a à voir avec mon problème http://www.open-std.org/jtc1/sc22/ [...] /n1469.pdf

n°1344466
tbp
Posté le 11-04-2006 à 20:41:56  profilanswer
 

nargy a écrit :


> cette union ne sert qu'a s'assurer de l'abscence de constructeurs à l'initialization
- ok, j'imagine que c'est plus efficace sans présumer des capacités du compilateur et des options de compil.


Moui, effectivement ça a voir avec le fait de traiter des POD ou pas, mais en fait pas seulement: comment produire un +/- infinie dans un initialiseur? Ou un NaN?
 
 
 
 
 

nargy a écrit :


mais j'aurai quand même une question: comment fonctionne le cache? je ne demande pas une réponse exhaustive, mais si vous avez un lien sur une doc, ou quelques recommandations. J'ai toujours considéré que pour un code trop long ou des données trop fournies les optimisations par cache devenaient secondaires, dû à la saturation du cache.


Pas de lien sous la main. Tu as differentes caches, je ne parles que de celles pour les instructions & données, de differents niveaux 1/2/3/etc en ordre croissant de taille. En general tout cela fonctionne par 'ligne' avec une regle du genre MRU (Most Recently Used). En gros.
Par exemple sur un K8 (Opteron, AMD64) les lignes de cache de donnée font 64 octets, chacune étant plus ou moins independante des autres. Quand il manque de place, le cpu évince celle qui a été utilisée en dernier. En gros.
Il faut aussi noter qu'il n'y a pas d'unité plus petite que la ligne de cache. Quand tu fais une operation d'écriture au mileu d'une ligne, c'est tout la ligne qui est marquée comme tripotée. Moralité il ne faut pas mélanger ce qui est en lecture seule et ce qui est en écriture.
 
Donc il se peut que tu ais en cache tout un jeu de donnée provenant des 4 coins de la mémoire, tout est affaire de flux.
 

nargy a écrit :

trop fort ce lien!
on peut utiliser FLD1 pour -1.0, en bidouillant la pile?


Tout est possible. De toute façon gcc sait generer fld1, fldpi etc... pour peu qu'il reconnaisse la constante, qu'il estime que ça permet de gagner du temps (ou de la place si tu optmises pour la taille) etc...

mood
Publicité
Posté le   profilanswer
 

 Page :   1  2
Page Précédente

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

  [C++/résolu] donnée static const Pi=3.14

 

Sujets relatifs
[Résolu]Problème avec un script de dockbar type mac OS[résolu] Supprimer des modules
[Résolu] ViewStatePourvoir lire dans une lib static
[ RESOLU ] structure boucleresolu :donner la valeur d'une var de sess à un champ caché ds un form
(résolu) [Java 3D] Comment centrer la vue sur des objets WaveFront[RESOLU]Mon neurone va exploser
[Résolu] typeid(résolu) [Java 3D] Changer l'apparence d'objets WaveFront
Plus de sujets relatifs à : [C++/résolu] donnée static const Pi=3.14


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