• [^] # Re: C++ type et performances

    Posté par . En réponse au message pre-realease de battle-rage un jeu de combat a la street fighter.. Évalué à 3. Dernière modification le 24 octobre 2016 à 14:15.

    En changeant l'ordre des questions.

    Est-ce-que le compilateur passe par du code assembleur pour produire du code machine ?

    Oui. L'assembleur va simplement transformer un fichier d'assembleur en un fichiers objet. Les instruction (mnemoniques) sont transformées en valeurs (opcodes) directement utilisable par le cpu. Donc ce que tu vois dans ton fichier .s correspond à un objdump -D sur ton fichier .o. À une exception près que certaines mnémoniques sont des mneoniques qui codent en fait une séquence d'autre mnémoniques, un peu comme si c'était des macros.

    (C'est ensuite l'éditeur de liens (le linker) qui lors de l'assemblage des différents fichiers objet va substituer certaines valeur d'adresse par le valeur absolue (en simplifiant). C'est cette étape qui permet à ton code de faire un "jmp label_fonction". Tu peux appeller sans problème une fonction "extern" depuis du code assembleur)

    Donc je voit mal des valeurs valeurs stocker dans plusieurs registres se chevauchant...???

    Je parlais de l'alignement en mémoire des tes variable.
    Si tu as:

    |00|01|02|03||04|05|06|07| (addresse)
    |--|B4|B3|B2||B1|--|--|--| (variable)
    

    Le mot B4B3B2B1 est à cheval sur les "mots mémoire" 0-1-2-3 et 4-5-6-7. Pour le charge dans un registre R1, tu vas d'abord le charger dans R2 le mot 0-3, R2 vaudra --B4B3B2. ensuite tu fais un shit pour avoir R2=B4B3B200, ensuite tu charge/shift 4-7 dans R1=B1------, R1=000000B1 et tu combine R1=R1 AND R2 = B4B3B2B1. Tout cela parce qu'un cpu 32 bit est éléctriquement conçu pour travailler sur des mots aligné sur 4 octes. Admettons que B3 soit un int8 que tu veuille mettre dans un registre, il vaut lire 0-3, et faire p.e. 2 shift, un à droite puis un à gauche (sur une archi petit boutant). Sur x86 c'est transparent, le cpu va le faire pour toi automatiquement, mais c'est plus lent donc vaut mieux travailler avec des variables alignées.

    j'en ai strictement marre qu'on me contredise a chaque fois que j'ai une idée.

    Ne te méprends pas là n'est pas mon objectif qui est de te donner de nouvelles notions et de répondre à ta demande de feedback. Comme je t'ai dis ce n'est pas une mauvaise idée en soit car il est vrai que tu économises de la mémoire en ce faisant.

    Si tu en le courage ont peut reprendre le truc (int8_t vs int) et (unsigned vs signed) en mettant l'accent sur la différence entre le compilateur qui produit du code machine et le processeur qui va exécuter le code machine.

    Je t'invite à faire l'expérience que je t'ai suggéré et en plus de faire un objdump -D sur les fichiers .o pour constater que tu auras strictement 2 fois la même chose. Tu peux encore utiliser le debugger gdb pour là partie "éxécution" mais tu ne verras rien de nouveau que tu n'aurais pas déjà vu dans le désassemblage par objdump.