代碼之美,不僅在於為一個給定問題找到解決方案,而且還在代碼的簡單性、有效性、緊湊性和效率內存)。代碼設計比實際執行更難 。因此,每一個程序員當用C語言編程時,都應該記著這些東西。本文向你介紹規范你的C代碼的10種方法。
0. 避免不必要的函數調用
考慮下面的2個函數:
- void str_print( char *str )
- {
- int i;
- for ( i = 0; i < strlen ( str ); i++ ) {
- printf("%c",str[ i ] );
- }
- }
- void str_print1 ( char *str )
- {
- int len;
- len = strlen ( str );
- for ( i = 0; i < len; i++ ) {
- printf("%c",str[ i ] );
- }
- }
- <span class="Apple-style-span"
- style="font-family: Georgia, 'Times New Roman', 'Bitstream Charter', Times, serif; font-size: 13px; line-height: 19px; white-space: normal;">
- 請注意 這兩個函數的功能相似。然而,第一個函數調用strlen)函數多次,而第二個函數只調用函數strlen)一次。因此第一個函數性能明顯比第二個好。
- </span>
- <span style="color: red;">
- <strong>更新:原作者應該是筆誤,把第一個函數寫成優於第二個,否則自相矛盾。)</strong>
- </span>
1、避免不必要的內存引用
這次我們再用2個例子來對比解釋:
- int multiply ( int *num1 , int *num2 )
- {
- *num1 = *num2;
- *num1 += *num2;
- return *num1;
- }
- int multiply1 ( int *num1 , int *num2 )
- {
- *num1 = 2 * *num2;
- return *num1;
- }
- <span class="Apple-style-span"
- style="font-family: Georgia, 'Times New Roman', 'Bitstream Charter', Times, serif; font-size: 13px; line-height: 19px; white-space: normal;">
- 同樣,這兩個函數具有類似的功能。所不同的是在第一個函數 1 for reading *num1 ,
- 2 for reading *num2 and 2 for writing to *num1)有5個內存的引用,而在第二個函數是只有2個內存引用one for reading *num2 and one for writing to *num1)。
- 現在你認為哪一個好些?
- </span>
2、節約內存內存對齊和填充的概念)
- struct {
- char c;
- int i;
- short s;
- }str_1;
- struct {
- char c;
- short s;
- int i;
- }str_2;
假設一個字符需要1個字節,short占用2個字節和int需要4字節的內存。起初,我們會認為上面定義的結構是相同的,因此占據相同數量的內存。然而,而str_1占用12個字節,第二個結構只需要8個字節?這怎麼可能呢?
請注意,在第一個結構,3個不同的4個字節被分配到三種數據類型,而在第二個結構的前4個自己char和short可以被采用,int可以采納在第二個的4個字節邊界一共8個字節)。
3、使用無符號整數,而不是整數的,如果你知道的值將永遠是否定的。
有些處理器可以處理無符號的整數比有符號整數的運算速度要快。這也是很好的實踐,幫助self-documenting代碼)。