« Programmation C/Types avancés » : différence entre les versions

Contenu supprimé Contenu ajouté
Tpierron (discussion | contributions)
Tpierron (discussion | contributions)
Ligne 55 :
<pre>
| bloc N | bloc N + 1 | bloc N + 2 |
---+---------------+---------------+-------------------+---
| a | b | c | d | e | f | g | h | i | j | k | l |
---+---------------+---------------+-------------------+---</pre>
Les cases <code>a</code>, <code>b</code>, et<code>c</code>, ainsi de suite... représentent des octets, et les ''blocs'' des sections de 32 bits, qui seules peuvent être adressées directement par la machine. Si on suppose qu'une variable de type <code>ma_structure</code> doive être placée en mémoire à partir du bloc numéro N, alors un compilateur pourra, pour des raisons de performance, placer <code>champ1</code> en <code>a</code>, <code>champ2</code> de <code>e</code> à <code>h</code>, et <code>champ3</code> en <code>i</code>. Cela permettrait en effet d'accéder simplement à <code>champ2</code>: une lecture ou une écriture de ce champ se fait simplement en lisant ou écrivant le bloc N + 1. Dans ce cas, les octets de <code>b</code> à <code>d</code> ne sont pas utilisés; on dit alors que ce sont des octets ''de bourrage'' (ou ''padding'' en anglais).
Un autre compilateur (ou le même, appelé avec des options différentes) peut aussi placer <code>champ2</code> de <code>b</code> à <code>e</code>, et <code>champ3</code> en <code>f</code>, pour optimiser l'utilisation mémoire. Mais alors il devra générer un code plus complexe lors des accès à <code>champ2</code>, le matériel ne lui permettant pas de le faire directement.