Вы пытаетесь сделать то, что оптимизация компилятора делает намного лучше, чем вы можете сделать вручную.Кроме того, C99 не имеет этих ссылочных конструкций так, как вы пытаетесь определить их в своем примере - в частности, объявления разыменования C ++ - если вы также получаете действительно большой и глубокий, я предлагаю вам переосмыслить свой алгоритм.Если вы попытаетесь ввести ряд временных переменных и больше памяти для ссылок, вы усложните свою жизнь.
Например, если вы посмотрите на:
struct some_struct {
int a;
struct {
float f;
double d;
} s;
};
struct some_struct array[10000];
int process1(struct some_struct *r) {
#define R (*r)
R.a+= 1;
R.s.f = R.s.f/2;
R.s.d = ( R.s.d + R.s.f ) * 2;
}
int process2(struct some_struct *r) {
r->a+= 1;
r->s.f = r->s.f/2;
r->s.d = ( r->s.d + r->s.f ) * 2;
}
int doit() {
int i;
for (i = 0; i < sizeof(array)/sizeof(struct some_struct); i++ ) {
struct some_struct *r = &array[i]; /* via reference */
process1(r);
process2(r);
}
}
process1 и process2 генерируют идентичные выходные данные сборки, используя gcc -O2 на платформе x86_64:
.file "foo.c"
.text
.p2align 4,,15
.globl process1
.type process1, @function
process1:
.LFB11:
.cfi_startproc
movss .LC0(%rip), %xmm0
addl $1, (%rdi)
mulss 8(%rdi), %xmm0
movss %xmm0, 8(%rdi)
unpcklps %xmm0, %xmm0
cvtps2pd %xmm0, %xmm0
addsd 16(%rdi), %xmm0
addsd %xmm0, %xmm0
movsd %xmm0, 16(%rdi)
ret
.cfi_endproc
.LFE11:
.size process1, .-process1
.p2align 4,,15
.globl process2
.type process2, @function
process2:
.LFB12:
.cfi_startproc
movss .LC0(%rip), %xmm0
addl $1, (%rdi)
mulss 8(%rdi), %xmm0
movss %xmm0, 8(%rdi)
unpcklps %xmm0, %xmm0
cvtps2pd %xmm0, %xmm0
addsd 16(%rdi), %xmm0
addsd %xmm0, %xmm0
movsd %xmm0, 16(%rdi)
ret
.cfi_endproc
.LFE12:
.size process2, .-process2
.p2align 4,,15
.globl doit
.type doit, @function
doit:
.LFB13:
.cfi_startproc
xorl %edx, %edx
movss .LC0(%rip), %xmm2
.p2align 4,,10
.p2align 3
.L4:
leaq (%rdx,%rdx,2), %rax
addq $1, %rdx
leaq array(,%rax,8), %rax
movss 8(%rax), %xmm1
addl $2, (%rax)
mulss %xmm2, %xmm1
cmpq $10000, %rdx
unpcklps %xmm1, %xmm1
cvtps2pd %xmm1, %xmm0
mulss %xmm2, %xmm1
addsd 16(%rax), %xmm0
movss %xmm1, 8(%rax)
unpcklps %xmm1, %xmm1
cvtps2pd %xmm1, %xmm1
addsd %xmm0, %xmm0
addsd %xmm1, %xmm0
addsd %xmm0, %xmm0
movsd %xmm0, 16(%rax)
jne .L4
rep
ret
.cfi_endproc
.LFE13:
.size doit, .-doit
.comm array,240000,32
.section .rodata.cst4,"aM",@progbits,4
.align 4
.LC0:
.long 1056964608
.ident "GCC: (GNU) 4.6.1"
.section .note.GNU-stack,"",@progbits