一个strcpy
94年的glibc里面的strcpy
- C/C++ code
/* Copy SRC to DEST. */char *DEFUN(strcpy, (dest, src), char *dest AND CONST char *src){ reg_char c; char *s = (char *) src; CONST ptrdiff_t off = dest - src - 1; do { c = *s++; s[off] = c; } while (c != '\0'); return dest;}
为啥会想到拿负数当下标进行计算?和当时的硬件有关系?
[解决办法]
用一个地址计算比用两个地址计算更快吧,或者,这代码会被编译器优化成把s直接存放到寄存器中,如果再增加一个地址,就要使用到内存??你反汇编看看,它是不是在整个计算地址的过程中只用到了寄存器,如果是的话,那应该就是一个地址效率更高的原因,所以才这样写,至于具体原因,不详,呵呵,但个人认为,库函数这东西,多半是追求效率的,只要能提高效率,哪怕再纠结的写法,也会用的