Не понял вопрос про x[i] и *x[i] - это ведь две совершенно разные вещи Может, ты имеешь ввиду x[i] и *(x+i) ??
Совершенно одинаковые. ПО ОПРЕДЕЛЕНИЮ. Но причём тут єто к написанному мной примеру?
А по поводу вида цикла, так зацикливаться на одном виде только ради полумифической оптимизации? Не понимаю такого. Значит я или ненормальный или не пацан :-)
Начнём с того, что часто придётся писать
if(len) do {
} while(--len);
что у более-менее вменяемого компилятора даст код, неотличимый от
for(;len;--len) {
}
За исключением варианта, когда вдруг захочется в цикле сделать continue; - тогда в do - while придётся делать goto на конец.
Далеко не всегда можно идти по массиву "назад", в таком случае do - while потребует дополнительной переменной для индексации массива.
Но даже если можно идти задом наперёд - всё равно некрасиво
do {
x[len-1] ...
} while(--len);
массивы-то с 0 индексуются.
Если даже не надо проверять len в начале (гарантированно не 0 или на 0 уже проверили выше и ругнулись), всё равно - в большинстве случаев разница for и do-while очень мала и в объёме кода, и в его быстродействии. У приличного хоть немного современного компилятора.
void foo(unsigned char *p, unsigned char len) {
do *p++ = 0; while(--len);
}
void foo1(unsigned char *p, unsigned char len) {
unsigned char i;
for(i=0; i
avr-gcc -O2 -S foo.c
.file "foo2.c"
.arch avr2
__SREG__ = 0x3f
__SP_H__ = 0x3e
__SP_L__ = 0x3d
__tmp_reg__ = 0
__zero_reg__ = 1
.global __do_copy_data
.global __do_clear_bss
.text
.global foo
.type foo, @function
foo:
/* prologue: frame size=0 */
/* prologue end (size=0) */
mov r31,r25
mov r30,r24
.L2:
st Z+,__zero_reg__
subi r22,lo8(-(-1))
brne .L2
/* epilogue: frame size=0 */
ret
/* epilogue end (size=1) */
/* function foo size 7 (6) */
.size foo, .-foo
.global foo1
.type foo1, @function
foo1:
/* prologue: frame size=0 */
/* prologue end (size=0) */
tst r22
breq .L12
mov r31,r25
mov r30,r24
.L10:
st Z+,__zero_reg__
subi r22,lo8(-(-1))
brne .L10
.L12:
ret
/* epilogue: frame size=0 */
/* epilogue: noreturn */
/* epilogue end (size=0) */
/* function foo1 size 9 (9) */
.size foo1, .-foo1
/* File "foo2.c": code 16 = 0x0010 ( 15), prologues 0, epilogues 1 */