ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Среда
10 июля
329250 Топик полностью
fk0, легенда (17.05.2012 18:05, просмотров: 185) ответил MegaJohn на однажды в исходниках к одному батарейному девайсу в парсере встретил for( ; i < strlen( ); i++ ) { bla-bla }. Аж поплохело
Случаев крайнего идиотизма не надо. Да и аж 0.1% к разряду батареи. Неоптимальные алгоритмы в других местах дадут все 90%. Бороться не за что. Тем более что попал мимо -- GCC на уровне -O1 выоптимизирует этот strlen нафиг:  #include <string.h> #include <stdio.h> unsigned f(const char *v) { unsigned n, r=0; for (n=0; n<strlen(v); n++) if (v[n] & 1) r++; return r; } int main(int ac, const char *av[]) { printf("%s contains %u odd characters\n", av[0], f(av[0])); return 0; } .file "test.c" .text .p2align 4,,15 .globl f .type f, @function f: .LFB23: .cfi_startproc pushl %esi .cfi_def_cfa_offset 8 .cfi_offset 6, -8 xorl %esi, %esi pushl %ebx .cfi_def_cfa_offset 12 .cfi_offset 3, -12 subl $20, %esp .cfi_def_cfa_offset 32 movl 32(%esp), %ebx movl %ebx, (%esp) call strlen xorl %edx, %edx jmp .L2 .p2align 4,,7 .p2align 3 .L4: movsbl (%ebx,%edx), %ecx andl $1, %ecx cmpl $1, %ecx sbbl $-1, %esi addl $1, %edx .L2: cmpl %eax, %edx jne .L4 addl $20, %esp .cfi_def_cfa_offset 12 movl %esi, %eax popl %ebx .cfi_def_cfa_offset 8 .cfi_restore 3 popl %esi .cfi_def_cfa_offset 4 .cfi_restore 6 ret .cfi_endproc .LFE23: .size f, .-f .section .rodata.str1.4,"aMS",@progbits,1 .align 4 .LC0: .string "%s contains %u odd characters\n" .section .text.startup,"ax",@progbits .p2align 4,,15 .globl main .type main, @function main: .LFB24: .cfi_startproc pushl %ebp .cfi_def_cfa_offset 8 .cfi_offset 5, -8 movl %esp, %ebp .cfi_def_cfa_register 5 pushl %ebx andl $-16, %esp subl $16, %esp movl 12(%ebp), %eax movl (%eax), %ebx .cfi_offset 3, -12 movl %ebx, (%esp) call f movl %ebx, 4(%esp) movl $.LC0, (%esp) movl %eax, 8(%esp) call printf xorl %eax, %eax movl -4(%ebp), %ebx leave .cfi_restore 5 .cfi_def_cfa 4, 4 .cfi_restore 3 ret .cfi_endproc .LFE24: .size main, .-main .ident "GCC: (Debian 4.6.2-11) 4.6.2" .section .note.GNU-stack,"",@progbits
[ZX]