2010-05-15 14 views
1

Pour ce code:Cela a-t-il quelque chose à voir avec endian-ness?

#include<stdio.h> 

void hello() { printf("hello\n"); } 
void bye() { printf("bye\n"); } 

int main() { 
    printf("%p\n", hello); 
    printf("%p\n", bye); 
    return 0; 
} 

sortie sur ma machine:

0x80483f4 
0x8048408 

[deuxième adresse est plus grande valeur]

sur Codepad

0x8048541 
0x8048511 

[deuxième adresse est plus petite valeur]

Est-ce que cela a quelque chose à voir avec l'endianité des machines? Dans le cas contraire,

  • Pourquoi la différence dans l'ordre des adresses?

  • Aussi, pourquoi la différence dans la différence?

    0x8048541 - 0x8048511 = 0x30

    0x8048408 - 0x80483f4 = 0x14


BTW, je viens de vérifier. Ce code (extrait de here) dit que les deux machines sont Little-Endian

#include<stdio.h> 
int main() {  
    int num = 1; 
    if(*(char *)&num == 1) 
     printf("Little-Endian\n"); 
    else  
     printf("Big-Endian\n"); 
    return 0;  
} 
+0

L'endianité concerne l'ordre des octets dans un type de données multi-octets. Rien à voir avec les adresses. (Il s'agirait de la façon dont ces adresses sont stockées, par exemple.) – GManNickG

+0

@GMan - Save the Unicorns: oui, je le pensais. – Lazer

Répondre

5

Cela n'a rien à voir avec l'endinance, mais avec le standard C++. C++ n'est pas nécessaire pour écrire des fonctions dans l'ordre où vous les voyez sur le disque (et penser à la liaison inter-fichiers et même relier d'autres bibliothèques, ce n'est pas faisable), il peut les écrire dans l'ordre souhaité. A propos de la différence entre les valeurs réelles, un compilateur peut ajouter des gardes autour d'un bloc pour empêcher les remplacements de mémoire (ou d'autres choses liées, généralement uniquement en mode débogage). Et rien n'empêche le compilateur d'écrire d'autres fonctions entre vos deux fonctions. Gardez à l'esprit même une simple application Hello World est livré avec des milliers d'octets de code exécutable. La ligne de fond est: ne jamais assumer quoi que ce soit sur la façon dont les choses sont positionnées en mémoire. Vos hypothèses seront presque toujours fausses. Et pourquoi même supposer? De toute façon, il n'y a rien à gagner à écrire du code normal, sûr et structuré.

+0

merci pour la réponse! ce que vous avez dit répond à ma question. Mais je me demandais juste s'il y aurait un moyen de dire au compilateur comment placer des objets en mémoire. ** Y a-t-il du texte sur cette partie de la gestion de la mémoire des compilateurs que je peux comprendre pour mieux comprendre? ** – Lazer

+0

Mmmm pas vraiment, vous dites seulement au compilateur une vue semi-haut niveau de ce que vous voulez dire (c-à-d.). Le compilateur gère la traduction en segments de code. Ceci étant dit, les compilateurs spécifiques ont des moyens (différents) de vous permettre d'exprimer comment vous voulez que les structures soient empaquetées (l'espace entre les champs) et alignées (la distance à partir des limites de bits 4/8/16/32/64). Vous ne pouvez pas dire au compilateur quoi que ce soit sur le code réel en cours de compilation. – Blindy

3

L'emplacement et l'ordre des fonctions est extrêmement spécifique à la plate-forme, l'architecture, compilateur, version du compilateur et même compilateur drapeaux (en particulier ceux).

6

Non, cela n'a rien à voir avec l'endianness. Il a tout à voir avec les compilateurs et les linkers étant libres de commander les définitions de fonction dans la mémoire à peu près comme ils le jugent bon, et différents compilateurs choisissant différentes stratégies de mise en page de la mémoire.

1

Vous imprimez des adresses de fonction. C'est purement dans le domaine de l'éditeur de liens, le compilateur ne fait rien qui soit impliqué dans la création de l'image binaire du programme. Autre que de générer les blobs du code machine pour chaque fonction. L'éditeur de liens organise ces tâches dans l'image finale.Certains linkers ont des options de ligne de commande qui affectent l'ordre, cela importe rarement. Endian-ness ne peut pas affecter la sortie de printf() ici. Il sait comment interpréter correctement les octets si la valeur du pointeur a été générée sur la même machine.