The C Programming Language

1. 宏定義中:do{}while(0)

2. i++與++i

3. static

4. extern

5. set -e

6. Makefile

%.d: %.c
    @set -e; rm -f $@; \
    $(CC) -M $(CPPFLAGS) $< > $@.$$$$; \
    sed 's,\($*\)\.o[ :]*,\1.o $@ : ,g' < $@.$$$$ > $@; \
    rm -f $@.$$$$

7. glibc中strcpy

char *strcpy(char *dest,const char *src)  
{  
  char c;  
  char *s = (char *) src;  
  const ptrdiff_t off = dest - s - 1;  
  do  
    {  
      c = *s++;  
      s[off] = c;  
    }  
  while (c != '\0');  
  return dest;  
}

網上分析(http://blog.chinaunix.net/uid-23629988-id-2740802.html):html

1. glibc這個strcpy的效率在Intel的某些CPU上確實效率不高——我測試了(Intel(R) Pentium(R) 4和Pentium(R) Dual-Core CPU E5300。有興趣的朋友能夠在其它CPU上測試一下,最好不是Intel的;shell

2. 通常glibc會根據不一樣的CPU實現不一樣版本的庫函數,如strcpy。固然,我以前也知道這一點,不過我並無去特地的看特定CPU的strcpy的 代碼。而是看這個generic的代碼——當時我認爲generic的strcpy仍然會高效。那麼實際上對於intel的CPU來講,有特定的 strcpy實現代碼。因此在intel的CPU上,glibc的strcpy確定會高效。c#

最好的答案就是glibc中的generic的實現代碼,並不必定會高效。若是真的要學習且實現代碼,看來仍是要學習該CPU上的特定的實現代碼。安全

8. string.h

C的字符串頭文件是<string.h>,在C++裏這個文件變成了<cstring>,string前面的c表示這個是c語言的;而C++的字符串頭文件是<string>,是利用的模板實現的,跟原先C的實現方法不同,但要安全得多。 VC++中有<string.h>文件,它就是C中的那個; 而<cstring>文件實際上只是在一個命名空間std中include了<string.h>,這是由於C++要減小名稱污染; 因此兩個都是能夠用的,但C++鼓勵用<cstring>。 <string>爲字符串實現了一個類,而實際上是依靠模板作的,這個能夠先不考慮。使用類,能夠將問題局部化,相似於把一個大問題分解成一個個小問題;並且類是具備類型安全的。 因此最好最好用C++的類。
相關文章
相關標籤/搜索