Предположим, мы должны очень широко использовать в некоторых функциях глубоко вложенный указатель:
function (ptr_a_t ptr_a) {
...
a = ptr_a->ptr_b->ptr_c->val;
b = ptr_a->ptr_b->ptr_c->val;
...
}
При условии, что все указатели проверены и допустимы, есть ли снижение производительности, проблемы с атомарностью или другие предупреждения (кроме читабельности)сравнение с:
function (ptr_a_t ptr_a) {
val = ptr_a->ptr_b->ptr_c->val;
...
a = val;
b = val;
...
}
Обновление Я скомпилировал этот файл c (написанный только для исследовательских целей) с помощью 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);
}
Для 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)
Для gcc -S -O1:
movl 8(%ebp), %eax
movl (%eax), %eax
movl (%eax), %eax
movl (%eax), %eax
movl %eax, 8(%esp)
movl %eax, 4(%esp)
То же самое я наблюдаю, используя volatile specifierвнутри структур.Таким образом, вложенные указатели принудительно оптимизируются.