Adresse des variables et temps d'accès

Bonjour,

En cette fin d'année il me vient une question tordue, et quelques questions subsidiaires tout aussi tordues.

Qui fixe les adresses des variables en mémoire : le compilateur ou plutôt l'éditeur de liens (linker) ?
Vu que les fichiers cpp sont compilés séparément il me semble que ce doit être le linker : vrai ou faux ?

Questions subsidiaires :
L'ordre dans lequel les fichiers objets sont transmis à l'éditeur de lien influe-t-il sur l'emplacement des adresses en mémoire ? Ou le linker commence-t-il par boucher les trous, ou les deux ?
Idem à l'intérieur d'un fichier objet l'ordre des déclarations a-t-il une influence sur les adresses mémoire ?
Et pour finir, en fait c'est là où je voulais en venir, la vitesse d'accès à une mémoire dépend t-elle de la position de son adresse dans la mémoire ?

Je n'ai aucun besoin actuel, c'est juste pour ma connaissance personnelle.
Merci.

Vu que les fichiers cpp sont compilés séparément il me semble que ce doit être le linker : vrai ou faux ?

vrai.

L'ordre dans lequel les fichiers objets sont transmis à l'éditeur de lien influe-t-il sur l'emplacement des adresses en mémoire ? Ou le linker commence-t-il par boucher les trous, ou les deux ?

A mon sens, mais je me trompe peut-être, le linker doit commencer par résoudre les symboles importés dans le startup, donc le main() en premier pour ce qui est du code applicatif. Ensuite il faudrait faire des essais pour confirmer mais je ne pense pas que l'ordre des objets influe sur les emplacements des adresses en mémoire.

Le seul moyen garanti d'obtenir un ordre précis des variables en mémoire est de les ranger dans une structure.
On peut aussi demander au linker de loger certaines fonctions dans des zones particulières de la FLASH, par exemple quand le processeur possède deux FLASHs, une interne l'autre externe.
On peut aussi placer des fonctions en RAM pour une exécution plus rapide (ISR par exemple).

Et pour finir, en fait c'est là où je voulais en venir, la vitesse d'accès à une mémoire dépend t-elle de la position de son adresse dans la mémoire ?

Tant qu'il s'agit de la même zone (FLASH ou RAM) le temps d'accès doit être identique.

@+

Tant qu'il s'agit de la même zone (FLASH ou RAM) le temps d'accès doit être identique.

Je ne maîtrise pas tout et je mélange probablement, si je pose cette question c'est qu'il y a plusieurs mois j'avais remarqué que si a l'intérieur d'une fonction on utilise une variable globale son temps d'accès (ou de traitement machin_global = truc ) est plus important que le temps d'accès à une variable définie dans la fonction.
A l'époque quelqu'un (je ne me rappelle plus qui) m'avait répondu que c'était explicable.

Mon chrono est toujours le même : le timer 3 avec prédiviseur = 1 --> résultat direct en nombre de cycles horloge.

Bonjour,

Les variables locales sont en général allouées dans la pile, mais le compilateur est libre de les allouer dans les registres (s'il y en a de disponible), ce qui évidemment accélère fortement leur accès.
Un bon compilateur commence à allouer les variables dans les registres et s'il ne peut pas (variable référencée par son adresse par exemple) ou quand il n'y a plus de registre disponible, il les alloue dans la pile.

Les variables locales sont en général allouées dans la pile, mais le compilateur est libre de les allouer dans les registres (s'il y en a de disponible), ce qui évidemment accélère fortement leur accès.

+1

Les variables locales sont en général allouées dans la pile, mais le compilateur est libre de les allouer dans les registres (s'il y en a de disponible), ce qui évidemment accélère fortement leur accès.

Compilateur ou linker ?

Sauf infirmation je reste sur le linker. Le linker fait ce qu'il veut ou ce qu'il peut et on ne peut rien prévoir, ni savoir ce qu'il a fait.
Vu le nombre d'option de GCC et de son linker il doit y avoir un moyen ?

C'est le compilateur qui décide comment seront implantées les variables. Le linker ne fait que les placer en mémoire (si nécessaire ) .
De toute façon les variables locales sont allouées dynamiquement et le linker n'est pas directement concerné par ce mécanisme Cependant c'est quand même le linker qui place la pile, le tas et les variables statiques (en fonction des paramètres qu'on lui a passés).

Je vais abuser :grin:

Quand avec des fonctions on passe des variables par valeur elles sont recopiée dans la fonction appellée (c'est ce que j'ai compris).
Sont-elle considérée dans la fonction appelée comme des variables locales ?

Et quand on les passe par adresse ? Ont-elle la même rapidité que des variables locales ?

Sont-elle considérée dans la fonction appelée comme des variables locales ?

Oui, et dans la mesure du possible elles sont dans des registres, sinon sur la pile.

Et quand on les passe par adresse ? Ont-elle la même rapidité que des variables locales ?

Il faudrait consulter la datasheet pour voir combien prend, en nombre de cycles, un adressage indirect par rapport à un adressage direct.

@+