CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

[C ++] déclaration variable dans boucle

Caudheur
Caudheur
Niveau 8
21 mars 2013 à 17:01:24

Bonjour à tous,

Voici une question que je me pose depuis longtemps :

Quand je dois parcourir un vecteur dans une boucle, je crée expressément à chaque tour de boucle un std::iterator.

Par exemple, une classe que j'appelle Personnage a pour attribut un vecteur de sprites. Dans sa méthode "dessiner()" que j'appelle à chaque frame, je fais donc quelque chose du genre :
http://pastebin.com/VwGZjvqX

Mais ce qui me soucie, c'est que je crée l'itérateur à chaque appel de boucle, en l’occurrence à chaque frame, ce qui me semble peu optimisé. Je n'ai aucune idée de la façon dont la mémoire est affectée par la création/destruction rapide de variables.

Je me demandais donc s'il y avait des modèles concurrents (je pensais par exemple à mettre cet itérateur en attribut de la classe personnage, mais je ne sais pas si ça change fondamentalement quelque chose).

Voilà, merci de m'éclairer sur ce point !

PocoIo
PocoIo
Niveau 10
21 mars 2013 à 18:20:37

Il n'y a pas vraiment de mal à faire ça, pour ma part je dirais que c'est normal, mettre l'itérateur en attribut de la classe ne changerait pas grand chose, de plus ce ne serait pas très propre car d'un point de vue "logique" l'itérateur n'a pas vraiment sa place dans les attributs de la classe.

Autrement niveau performance cela ne pose pas vraiment de problème, je te suggère surtout d'éviter d'effectuer des appels trop fréquents à malloc ou new car ces opérations sont assez coûteuses et fragmentent la mémoire.
Pour des applications comme des jeux qui impliquent souvent un grand nombre de construction/destruction d'objets les développeurs utilisent souvent leur propre système de gestion de mémoire, ils allouent un (ou plusieurs) grand bloc de mémoire avec malloc ou new au départ et se servent de cet espace pour stocker les objets.

Dans ton cas "it" est une variable locale (ou automatique), elle est stockée sur la pile qui est un espace mémoire de taille fixe alloué au lancement du programme (à vrai dire chaque thread du programme à son propre espace de pile), l'impact niveau performance est moins important.

Caudheur
Caudheur
Niveau 8
21 mars 2013 à 18:24:04

Ok merci, ça me rassure. Et est ce que le compilateur "reconnaît" ce genre de demande est l'optimise ?

PocoIo
PocoIo
Niveau 10
21 mars 2013 à 18:26:42

De quel genre de "demande" parles-tu exactement?

Caudheur
Caudheur
Niveau 8
21 mars 2013 à 18:28:26

Dans les cas où je crée et détruis une variable du même type à chaque tour de boucle par exemple :question:

Caudheur
Caudheur
Niveau 8
21 mars 2013 à 18:29:48

Peut être que ma question n'a pas de sens dans la mesure où je ne connais pas le fonctionnement dans compilateur !

PocoIo
PocoIo
Niveau 10
21 mars 2013 à 18:35:26

" Dans les cas où je crée et détruis une variable du même type à chaque tour de boucle par exemple :question: "

Pas à ma connaissance, sauf si c'est un invariant que tu as déclaré à l'intérieur d'une boucle, le compilateur peut décider lui-même de le déplacer hors de la boucle:

http://fr.wikipedia.org/wiki/D%C3%A9placement_des_invariants_de_boucle

Après tous les compilateurs C++ sont différents et optimisent le code de façon différente.

Caudheur
Caudheur
Niveau 8
21 mars 2013 à 18:37:09

Bah d'une part ça crée toujours une variable sur le tas (certes ce n'est qu'un pauvre integer), et de l'autre je préfère utiliser l'itérateur :)

Caudheur
Caudheur
Niveau 8
21 mars 2013 à 18:37:51

Poccolo : merci pour le lien, ça m’intéresse beaucoup.

PocoIo
PocoIo
Niveau 10
21 mars 2013 à 18:38:22

" Bah d'une part ça crée toujours une variable sur le tas "

Non, une variable est allouée sur le tas lorsque tu utilise malloc ou new.

Caudheur
Caudheur
Niveau 8
21 mars 2013 à 18:42:49

Pardon, alors j'aurais dû dire que je la déclare.

PocoIo
PocoIo
Niveau 10
21 mars 2013 à 18:56:21

Tu aurais dû dire "pile" au lieu de "tas" surtout, comme je l'ai dit plus haut le tas c'est lorsque tu utilises malloc ou new, tu demandes à l'OS d'allouer un nouveau bloc de mémoire pour stocker ta variable.

Alors que la pile, tu peux voir ça un peu comme un tableau statique de style C. Si tu écris "char c = 5;" dans une fonction par exemple, tu assignes juste la valeur 5 à une case de la pile (ou la variable pourrait être stockée dans un registre du processeur mais ne rentrons pas dans les détails), il n'y a aucune allocation de mémoire qui est effectuée.

godrik
godrik
Niveau 30
21 mars 2013 à 21:11:11

un "vector<Sprite>::iterator" n'est pas beaucoup complique qu'un Sprite* apres compilation. Donc tu ne perds rien dans le sens ou il n'y a rien a construire.

Rappelle toi un principe important en ingenierie logicielle: ne pratique pas d'optimisation premature. Concentres toi sur les algorithmes et structures de donnees. Si ton programme est toujours trop lent apres ca, alors commence a te poser des questions d'optimisation. Avant tu te fais certainement juste chier pour rien.

chris_27
chris_27
Niveau 10
22 mars 2013 à 00:16:05

"Mais ce qui me soucie, c'est que je crée l'itérateur à chaque appel de boucle, en l’occurrence à chaque frame, ce qui me semble peu optimisé." :d) tu ne crées en réalité rien du tout. Et donc si, c'est optimisé.

Caudheur
Caudheur
Niveau 8
22 mars 2013 à 18:17:36

Ok, merci à tous pour vos réponses. En fait je ne cherche pas tant à optimiser pour gagner en vitesse ou en coût mémoire, qu'à mieux connaître les coulisses.

chris_27
chris_27
Niveau 10
23 mars 2013 à 11:31:23

Dans ce cas, arrête le C++ temporairement et va voir la notion de pointeur en C.

Sous forums
  • Aide à l'achat Mac
  • Création de sites web
  • Internet
  • Macintosh
  • Création de Jeux
  • Linux
  • Programmation
  • Steam Deck
  • Hardware
La vidéo du moment