(Taille de) (Tailleof) Toujours renvoie toujours 1 fort> dans le compilateur 32 bits GCC. Mais puisque la taille de bloc de base dans le compilateur 32 bits est de 4, comment le caractère occupe-t-il un octet unique lorsque la taille de base est de 4 octets ??? p> Considérant les éléments suivants: P> struct st
{
int a;
char c;
};
8 Réponses :
C'est l'alignement de la structure avec le rembourrage. C code> utilise 1 octet, 3 octets sont non utilisés. Plus ici P>
Malheureusement, le lien semble mort. Je sais que ça fait 11 ans, mais si vous pouvez le trouver ailleurs, je pense que je ne serai pas le seul intéressé :)
@ A.Occannaille en effet la page est partie. Une leçon précieuse pour ne pas utiliser de liens dans les réponses. J'ai remplacé par un lien réel à MSDN.
Merci beaucoup pour votre édition et votre réactivité :-)
La raison pour laquelle votre structure est de 8 octets longs plutôt que 5 (comme vous pouvez vous attendre à), est que le compilateur ajout de remplissage em> à la structure afin de garder tout bien aligné sur cette longueur de mot native , encore une fois pour une plus grande efficacité. La plupart des compilateurs vous donnent l'option de Pack em> une structure, avec une directive Il y a un article Wikipedia appelé Alignement de la structure de données qui a une bonne explication et des exemples. < / p> Tailleof (Char) code> est toujours 1. Toujours. La "taille du bloc" dont vous parlez est juste la taille de mot native de la machine - généralement la taille qui entraînera une opération la plus efficace. Votre ordinateur peut toujours aborder chaque octet individuellement - c'est ce que l'opérateur code> de la taille code> vous indique. Lorsque vous faites
Tailleof (int) code>, il renvoie 4 pour vous dire qu'un
int code> est de 4 octets sur votre machine. De même, votre structure est de 8 octets longtemps. Il n'y a aucune information de
Tailleof code> sur le nombre de bits il y a dans un octet. p>
#pragma CODE> ou une autre extension de compilateur, auquel cas vous pouvez forcer votre structure à prendre une taille minimale, quelle que soit la longueur de votre machine de votre machine. P>
Char code> est la taille 1, car c'est la taille d'accès la plus petite que votre ordinateur peut gérer - pour la plupart des machines une valeur 8 bits. Le
Taille de l'opérateur CODE> vous donne la taille de toutes les autres quantités en unités du nombre d'objets
char code> aurait la même taille que tout ce que vous avez demandé. Le compilateur à votre structure de données pour des raisons de performances pour des raisons de performance, de sorte que vous ne le pensez de la définition de la structure. P>
J'ai lu la question comme suit: "Je comprends des tailles de blocs, mais pourquoi Tailleof (Char) renvoie-t-elle moins que la taille du bloc, tandis que Tailleof (Silf) renvoie une valeur rembourrée."
@Aaron, je pense que mon deuxième paragraphe couvre cela, non? Pensez-vous que je dois ajouter des éclaircissements?
Il a demandé pourquoi tailleof (char) code> ne comprend pas le remplissage. La réponse est qu'il n'y a pas de remplissage à
char code>, il peut être attribué sur 1 octet, nous pouvons le stocker sur l'espace alloué avec
MALLOC (1) code>.
ST CODE> ne peut pas être enregistré sur l'espace alloué avec
MALLOC (5) code> car lorsque
st code> struct est copié 8 octets sont en cours de copie.
@Aaron, c'est la question exacte !!! @Carl, je pense que le 2e paragraphe aurait besoin de plus de précisions concernant la question de Aaron.
@Shyam, j'ai ajouté un autre paragraphe pour étendre l'explication du rembourrage de la structure de données.
@Carl, c'est plus clair. Est-il sûr de dire que la taille de (struct ...) renvoie la taille rembourrée car la structure elle-même "encapsule" le rembourrage; Le compilateur (?) Ne retournera-t-il pas ce que les petites allocations de la structure sont sans une introspection?
Sizeof renvoie la valeur en octets. Vous parliez de bits. Les architectures 32 bits sont des mots alignés et des octets référencés. Il n'est pas pertinent que l'architecture stocke un char, mais à compiler, vous devez faire référence à des caractères 1 octets à la fois, même s'ils utilisent moins de 1 octet. p>
C'est pourquoi la taille de (char) est 1. p>
INTS sont 32 bits, d'où la taille de (int) = 4, les doubles sont 64 bits, d'où la taille de la taille (double) = 8, etc. p>
Un int code> est généralement i> 32 bits sur des architectures 32 bits, mais il n'est pas défini à toujours i> 32 bits.
C'est ce que je voulais dire, désolé. Le stockage utilisé pour ces trucs n'est pas spécifié, juste ce court <= int <= long <= long <= longlong, flotteur <= double <= Long double / quad
Tout d'abord, Votre structure retourne une taille de 8. Il s'agit d'une somme de trois choses: la taille du edit: strong> juste parce que la taille du bloc est que quatre octets ne signifie pas qu'un type de données ne peut pas être inférieur à quatre octets. Lorsque la CPU charge un code> Char code> dans un registre 32 bits, la valeur sera automatiquement étendue (par le matériel) pour le faire remplir le registre. La CPU est suffisamment intelligente pour traiter les données des incréments de N octets (où N est une puissance de 2), tant qu'elle n'est pas plus grande que le registre. Lors du stockage des données sur disque ou en mémoire, il n'y a aucune raison de stocker chaque Tailleof code> retourne un certain nombre de octets em>, pas de bits.
Tailleof (Char) == 1 Code> vous dit qu'un
Char code> est de huit bits (un octet) long. Tous les types de données fondamentaux en C sont au moins un octet long. P>
int code>, la taille du
char code> (que nous savons est < Code> 1 code>) et la taille de tout rembourrage supplémentaire que le compilateur ajouté à la structure. Étant donné que de nombreuses implémentations utilisent un 4 octet
int code>, cela impliquerait que votre compilateur ajoute 3 octets de remplissage à votre structure. Très probablement, cela est ajouté après le
Char code> afin de rendre la taille de la structure un multiple de 4 (une des données d'accès de processeur 32 bits plus efficacement dans des morceaux de 32 bits et 32 bits est de quatre octets ). p>
Char code> comme quatre octets. Le
Char code> dans votre structure est arrivé à ressembler à quatre octets longs à cause du rembourrage ajouté après. Si vous avez changé votre structure pour avoir deux em>
char code> variables au lieu d'une, vous devez voir que la taille de la structure est la même (vous avez ajouté un octet supplémentaire des données, et Le compilateur a ajouté un octet inférieur de remplissage). P>
Pour être pédants, taille de (caractère) == 1 vous dit qu'un caractère est une taille de caractère. La norme C ne nécessite pas de système de fonctionnement en octets.
@ Darron- qui est incorrect. Section 6.5.3.4 de la spécification C ( Open-std .Org / JTC1 / SC22 / WG14 / www / DOCS / N1256.PDF ) Spécifie "The Tailleof" / code> Opérateur donne la taille (en octets) de son opérande ".
Le paragraphe 3 de cette section "Lorsqu'il est appliqué à un opérande qui possède de type caractère, de caractère non signé ou de caractère signé, (ou une version qualifiée de celle-ci) le résultat est de 1". La section 3.6 définit l'octet comme "Unité adressable de stockage de données suffisamment grandes pour contenir tout membre de l'ensemble de caractères de base de l'environnement d'exécution". Ce n'est pas que les gens d'octets pensent normalement.
@ Darron: Mais c'est un octe néanmoins. Il n'est tout simplement pas nécessaire d'être largement de 8 bits.
Code exemple de démontrage de la structure d'alignement de la structure: La taille de la structure code> est plus grosse que la somme de ses composants individuels, car il a été réglé pour être divisible par 4 octets par le compilateur 32 bits. Ces résultats peuvent être différents sur différents compilateurs, surtout s'ils sont sur un compilateur 64 bits. P> P>
En raison du rembourrage d'optimisation est ajouté de sorte que la taille d'un objet est Char code> ne doit pas nécessairement être rembourré, il peut être attribué sur 1 octet, nous pouvons le stocker sur l'espace alloué avec
MALLOC (1) code>.
st code> ne peut pas être stocké sur l'espace alloué avec
MALLOC (5) code> car lorsque
st code> struct est copié 8 octets sont copiés. P >
Cela fonctionne de la même manière que l'utilisation d'un demi-papier. Vous utilisez une partie pour un char et l'autre partie pour autre chose. Le compilateur va cacher cela de vous depuis que le chargement et le stockage d'un caractère dans un registre de processeur de 32 bits dépend du processeur. p>
Certains processeurs ont des instructions pour charger et stocker uniquement des parties des autres 32 bits doivent utiliser des opérations binaires pour extraire la valeur d'un caractère. P>
S'attaquer à un charcuterie fonctionne comme une définition la plus petite mémoire adressable. Sur un système de système de 32 bits à deux inserts différents, au moins 4 points d'adresse, les adresses de caractère ne seront que 1 à part. P>
Tous les tailles d'objets en C et C ++ sont définies en termes de octets em>, pas bits em>. Un octet est la plus petite forte> une unité de mémoire adressable forte> sur l'ordinateur. Un bit est un seul chiffre binaire, un sur la plupart des ordinateurs, un octet est de 8 bits (un octet peut donc stocker des valeurs de 0 à 256), bien que des ordinateurs existent avec d'autres tailles d'octets. P> une adresse mémoire identifie un octet em>, même sur des machines 32 bits. Adresses N et N + 1 point à deux octets ultérieurs. P> AN dans une machine 32 bits, tous les 32 em> signifie réellement que la CPU est conçue pour fonctionner efficacement avec 32 bits Les valeurs et qu'une adresse est de 32 bits de long. Cela ne signifie pas que la mémoire ne peut être adressée que dans des blocs de 32 bits. P> La CPU peut toujours adresser des octets individuels, ce qui est utile lorsqu'il s'agit de comme pour votre exemple: p> A donc en théorie, le compilateur pourrait em> ont donné à votre structure une taille de 5 octets ... Sauf que cela ne fonctionnerait pas si vous créez un tableau de dans un tableau, Chaque objet est placé immédiatement après la précédente, sans rembourrage. Donc, si le premier objet de la matrice est placé à une adresse divisible par 4, l'objet suivant serait placé à une adresse supérieure de 5 octets, qui serait pas em> être divisible par 4, et donc la seconde La structure dans la matrice ne serait pas correctement alignée. p> Pour résoudre ceci, le compilateur inserdit le remplissage à l'intérieur em> la structure, de sorte que sa taille devient un multiple de son alignement. P > non pas parce qu'il est impossible de créer des objets qui n'ont pas de taille qui est un multiple de 4, mais que l'un des membres de votre si vous créez une structure de deux < Code> Char CODE> S, il n'obtiendra pas une taille de 4. Cela obtiendra généralement une taille de 2, car lorsqu'il contient uniquement 0 code> ou un
1 code>.
INT code>, qui est typiquement 32 bits couvrant 4 octets, ce qui signifie que 4 adresses de mémoire différentes existent que chaque point à la partie du
int code>. p>
Char code> S, par exemple . p>
Tailleof (ST) code> retourne 8 pas parce que toutes les structures ont une taille divisible par 4, mais à cause de alignement em>. Pour que la CPU lise efficacement un entier, il doit être situé sur une adresse divisible par la taille de l'entier (4 octets). Donc, un
int code> peut être placé sur l'adresse 8, 12 ou 16, mais pas sur l'adresse 11. P>
Char code> ne nécessite que son adresse pour être divisible par la taille d'un
char code> (1), il peut donc être placé sur toute adresse em>. p>
st code> Objets. P>
ST code> STR nécessite un alignement de 4 octets et Donc, chaque fois que le compilateur place un
int code> en mémoire, il doit s'assurer qu'il est placé à une adresse divisible par 4. p>
char code> s, l'objet peut être placé à n'importe quel adresse, et ainsi l'alignement n'est pas un problème. p> p>
Efficacement un duplicata de Pourquoi la taille d'une structure n'est-elle pas égale à la somme de taille de chaque membre?
En écrivant des programmes portables C, j'ai appris à ne pas assumer une grande partie de rien; Même la déclaration
La taille de bloc de base en compilateur 32 bits est de 4 octets code> est une hypothèse qui peut ne pas être vraie, car les tailles de données et les tailles d'adresses ne sont pas nécessaires pour être identiques. La "taille de bloc de base" dépend de l'architecture d'accès à la mémoire d'un système et ne doit pas correspondre à la taille du registre des données. Juste un côté, car cela n'affecte pas votre question fondamentale sur les tailles de structure C.
-1 pour revenir à l'utilisation incorrecte de "bit" où vous voulez dire "octet"
Je suppose que tu veux dire des octets, pas des morceaux?
@James, je ne pense pas que ce soit un duplicata. L'autre question n'assume aucune connaissance du rembourrage ou de l'alignement. Cette question concerne pourquoi la taille de la valeur de retourne apparemment la valeur rembourrée dans certains cas et non d'autres.
@Shyam, dans votre question, cela devrait être: "Mais puisque la taille de bloc de base en 32 bits est de 4 octets, comment le caractère occupe-t-il un octet unique lorsque la taille de base est de 4 octets ???" et " ST) renvoie comme 8 comme convenu avec la taille du bloc par défaut de 4 octets (puisque 2 blocs sont attribués) "Il y a huit bits dans un octet, 4 octets en 32 bits.
@Mike: Si l'OP est confondu de la différence entre les bits et les octets, cela devrait être expliqué dans une réponse. Ne changez pas le sens de sa question.
@JAlf - Vous semblez mal comprendre la nature de ce site. Que pensez-vous précisément que la fonctionnalité d'édition d'édition et de communauté est-elle là pour? Ce n'est pas là pour de bonnes looks. Si quelqu'un avec un pauvre anglais a roulé d'un nettoyage de langue, cela serait également faux. Le sens de cette question est évident pour la plupart des personnes qui le visitent. Cela aurait dû être évident pour l'OP après la première modification. Aucun commentaire requis.
@Mike: Lorsque vous émettez, regardez dans la barre latérale droite. Il dit de "respecter l'auteur original". Si l'auteur d'origine ne comprend pas lui-même la différence entre un peu et un octet, et il est crucial pour sa question, c'est quelque chose que la réponse doit s'adresser, et elle ne peut être balayée sous le tapis comme "juste une erreur de langue" . Mon commentaire n'est pas parce que vous l'avez édité (ce qui est compréhensible - nous ne pouvons pas toujours que l'auteur avait l'intention d'écrire), mais votre enfantin -1 parce qu'il a roula votre édition. Il a senti que la question ne représentait plus ce qu'il avait l'intention de demander.
Sa question est mal i>, sûr, cela ne dit pas strictement de sens parce qu'il mêle d'octets et de bits, mais il s'agit clairement de ce qu'il veut savoir, nous devrons donc simplement le refuser dans les réponses. La Répondre i> à la question est évidente pour vous et moi, mais il est également évident pour moi que la pop ne comprenne tout simplement pas la différence entre les bits, octets et mots. Il n'a pas tapé "bit" au lieu de "octet" comme une faute de frappe. Il l'a fait parce qu'il ne connaissait pas la différence. Quoi qu'il en soit, en descendant le PO pour avoir exercé son droit de contrôler sa propre question est enfantin et offensant.
Tout d'abord, je n'étais pas la personne qui a fait la modification. J'ai voté dans le roulement d'une édition car c'est une mauvaise pratique et nuisible pour le site, pas parce que mes sentiments étaient blessés. Deuxièmement, nous devrons accepter de ne pas être d'accord sur la question de la modification de la question. Si le point de sorte de ne pas simplement répondre à la question pour une personne, mais pour toutes les personnes qui la recherchent, la modification de la question pour refléter avec précision la question de la réponse est, à mon avis, la meilleure façon de faire face aux problèmes comme l'op. Vous remarquerez que j'ai laissé un commentaire afin que l'OP puisse apprendre de l'erreur.
@JaIF ... Je suis l'astucieux de cette question et je connais très bien la différence entre les bits et les octets et c'est à vous de venir à des hypothèses sur ma connaissance des bits et des octets ... Je suis renommé parce que je n'ai pas remarqué le Modifier sur la question et aussi je suis nouveau sur ce site et ne connaissez pas les fonctionnalités ... Pls ne vient à aucune conclusion concernant ma compréhension des concepts ...
@Mike Burton .... Tout d'abord, je n'ai pas remarqué la modification faite par un utilisateur. Je viens de recevoir un message que c'était édité et je me suis renoncé depuis que je ne pouvais pas voir la modification visiblement ... "" Changer les "bits" à "octets". " La personne qui a fait l'édition pourrait avoir au moins à gauche une petite note à la fin ... Je ne pense pas non plus que vous êtes si intéressé à la descendre à une question à cause d'une petite faute de frappe ... vous semblez avoir des idées amusantes sur l'application Correcless dans tout ... La plupart d'entre eux ont remarqué la faute de frappe comme étant évidente dans l'ensemble initial de commentaires et aucun d'entre eux ne sont pas révélés !!!
@Mike ... et j'ai appris quelque chose de vos réponses ... "Ne faites jamais de fautes de frappe ou de bien-être en matière de correction en viennent de baisser votre question" .. je vais essayer de le suivre !!!
@Shyam: Ce n'était pas un vote méchant, il fut censé attirer votre attention, que les commentaires et même la modification lui-même ne semblaient pas faire. Vous pouvez afficher une historique de modification en surbrillance en cliquant sur la note modifiée juste en dessous de la question. C'est drôle pour moi à quel point la réaction de la réaction d'un simple avoine avec commentaire est sur cette question ... Partout ailleurs sur le site, les gens mendient pour commentaires pour accompagner les bowvotes, voici une attaque sur eux! Prudent ce que vous souhaitez, comme on dit.
@Mike ... C'est la première fois que je sache même qu'une option d'histoire de modification existe ... comme je l'ai déjà dit que je ne me suis pas connu parce que je ne le savais pas, car je l'ai changé à la version renommée. Plus j'ai ajouté Quelques nouveaux commentaires .. Je pense que cela serait plus que suffisant.
@Shyam: Absolument. J'ai déjà révoqué le Downvote.
Dupliqué possible de Pourquoi les littéraux de caractères C au lieu de caractères? < / a>