Supposons que nous devions utiliser dans une fonction un pointeur profondément imbriqué de manière très extensive :
function (ptr_a_t ptr_a) {
...
a = ptr_a->ptr_b->ptr_c->val;
b = ptr_a->ptr_b->ptr_c->val;
...
}
En supposant que tous les pointeurs sont vérifiés et valides, y a-t-il une dégradation des performances, des problèmes d'atomicité ou d'autres problèmes (sauf la lisibilité) en comparaison avec :
function (ptr_a_t ptr_a) {
val = ptr_a->ptr_b->ptr_c->val;
...
a = val;
b = val;
...
}
Mise à jour J'ai compilé ce fichier c (écrit uniquement à des fins d'investigation) avec gcc -S :
typedef struct {
int val;
} c_str_t;
typedef struct {
c_str_t *p_c;
} b_str_t;
typedef struct {
b_str_t *p_b;
} a_str_t;
void func (a_str_t *p_a)
{
int a,b;
a = p_a->p_b->p_c->val;
b = p_a->p_b->p_c->val;
printf("", a,b);
}
Pour gcc -S :
movl 8(%ebp), %eax
movl (%eax), %eax
movl (%eax), %eax
movl (%eax), %eax
movl %eax, -4(%ebp)
movl 8(%ebp), %eax
movl (%eax), %eax
movl (%eax), %eax
movl (%eax), %eax
movl %eax, -8(%ebp)
Pour gcc -S -O1 :
movl 8(%ebp), %eax
movl (%eax), %eax
movl (%eax), %eax
movl (%eax), %eax
movl %eax, 8(%esp)
movl %eax, 4(%esp)
J'observe la même chose en utilisant volatile spécificateur à l'intérieur des structures. Ainsi, les pointeurs imbriqués sont optimisés de manière forcée.