ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Суббота
18 мая
52836 Топик полностью
ReAl (03.03.2006 15:21, просмотров: 1) ответил ReAl на Да, поэтому единственная оптимизация таких мест, которую я делаю последние лет так ...
Не понял вопрос про 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 */