2017-06-22 8 views
0

Cas 1:
Définition de toutes les constantes que la définition de préprocesseur utilisant #define comme:différent Mémoire-besoin en cas d'utilisation "const" et "#define" IAR

#define x   12 

Utilisation de la mémoire (de file_name.lst)

2 240 bytes of CODE memory 
    920 bytes of DATA memory 

cas n ° 2:
Définition de toutes les constantes que la définition du compilateur en utilisant comme const unsigned int:

const unsigned int x = 12; 

Utilisation de la mémoire (de file_name.lst)

2 240 bytes of CODE memory 
    1 byte of CONST memory 
    920 bytes of DATA memory 

Mes questions:
Où sont les définitions préprocesseur enregistrées? Flash, RAM, ailleurs?
Cela signifie-t-il que la définition du préprocesseur est un moyen de réduire l'utilisation de la mémoire?

+2

Les macros de préprocesseur n'existent plus au moment de l'exécution, elles ne sont donc sauvegardées nulle part. Le '12' sera codé en dur dans votre exécutable. – mch

+1

"codé en dur dans [...]", i. e. ils sont réellement cachés dans la section de mémoire de CODE, e. g. dans les instructions correspondant au code assembleur comme 'ajouter eax, 12' ... – Aconcagua

Répondre

4

Les définitions du préprocesseur sont résolues par le préprocesseur. Cela signifie que le préprocesseur remplacera chaque occurrence du nom défini (c'est-à-dire x) dans votre code source par la valeur définie (c'est-à-dire 12). Le préprocesseur s'exécute avant le compilateur (d'où le nom de préprocesseur). Pendant la compilation et l'exécution, il n'y a plus de x, la compilation ne voit que les 12 dans les endroits où vous avez écrit x.

1

Tous les numéros doivent être stockés quelque part - vous ne pouvez pas attribuer des numéros dans les airs. La quantité de mémoire utilisée sera la même quelle que soit la méthode utilisée. Cependant, vous pourriez être amené à penser qu'il y a une différence, soit par les noms de segments de mémoire ou par les paramètres de l'optimiseur.

Si vous utilisez le pré-processeur, ils sont intégrés dans le code machine s'ils sont utilisés par le programme (nom de segment .text ou CODE dans votre cas). Juste en tapant #define x 12 sans utiliser x dans le programme, cela signifiera que la valeur n'est stockée nulle part puisqu'elle n'est pas utilisée.

Si vous le déclarez, un const se retrouvera dans un segment de données en lecture seule (.rodata ou un nom similaire) ou sur la pile, en fonction de la portée. Il peut être alloué même si la variable n'est pas utilisée, en fonction des paramètres de l'optimiseur de compilation.

Les segments de données de code et de lecture seule seront stockés en mémoire flash sur un microcontrôleur.