Tout d'abord, gcc
n'est pas toujours le faire. Le rembourrage est contrôlée par -falign-functions
, ce qui est activée automatiquement par -O2
et -O3
:
-falign-functions
-falign-functions=n
Aligner le début de fonctions à la puissance de deux supérieure n
, en sautant n
octets. Par exemple,
-falign-functions=32
harmonise les fonctions, à la prochaine 32-frontière d'octet, mais -falign-functions=24
permettrait d'aligner à la prochaine 32-frontière d'octet seulement
si cela peut être fait en sautant de 23 octets ou moins.
-fno-align-functions
et -falign-functions=1
sont équivalentes et dire que les fonctions ne seront pas alignés.
Certains assembleurs seulement de soutenir cet indicateur lorsque n est une puissance de deux; dans
ce cas, il est arrondi.
Si n n'est pas spécifié ou est égal à zéro, utilisez un dépendant de la machine par défaut.
Permis à des niveaux -O2-O3.
Il pourrait y avoir plusieurs raisons pour cela, mais la principale sur x86 est probablement ce:
La plupart des processeurs chercher des instructions dans aligné 16 octets ou 32 octets de blocs. Il peut être
avantageux pour aligner critique de la boucle et les entrées de sous-routine entrées par 16 dans le but de minimiser
le nombre de 16 octets limites dans le code. Assurez-vous également qu'il n'existe pas de 16 octets à la frontière dans les premières instructions après une critique de la boucle d'entrée ou de la sous-routine d'entrée.
(Cité dans "l'Optimisation des sous-routines en assembleur
la langue" par Agner Brouillard.)
edit: Voici un exemple qui illustre l'padding:
// align.c
int f(void) { return 0; }
int g(void) { return 0; }
Lors de la compilation avec gcc 4.4.5 avec les paramètres par défaut, j'obtiens:
align.o: file format elf64-x86-64
Disassembly of section .text:
0000000000000000 <f>:
0: 55 push %rbp
1: 48 89 e5 mov %rsp,%rbp
4: b8 00 00 00 00 mov $0x0,%eax
9: c9 leaveq
a: c3 retq
000000000000000b <g>:
b: 55 push %rbp
c: 48 89 e5 mov %rsp,%rbp
f: b8 00 00 00 00 mov $0x0,%eax
14: c9 leaveq
15: c3 retq
La spécification -falign-functions
donne:
align.o: file format elf64-x86-64
Disassembly of section .text:
0000000000000000 <f>:
0: 55 push %rbp
1: 48 89 e5 mov %rsp,%rbp
4: b8 00 00 00 00 mov $0x0,%eax
9: c9 leaveq
a: c3 retq
b: eb 03 jmp 10 <g>
d: 90 nop
e: 90 nop
f: 90 nop
0000000000000010 <g>:
10: 55 push %rbp
11: 48 89 e5 mov %rsp,%rbp
14: b8 00 00 00 00 mov $0x0,%eax
19: c9 leaveq
1a: c3 retq