C 語言贈予程序員對硬件的近乎完全控制權。本文總結工程實踐中的四大效能優化策略,由淺入深:**空間換時間 → 數學建模 → 位運算替代除模 → 內嵌匯編**,每招附帶對比代碼、匯編視角分析、適用場景與風險提示。
// 方式 A:運行時構建
char s1[32]; memset(s1,0,32); strcpy(s1, "This is a example!!");
// 方式 B:編譯期常量 + 指針引用
const char s2[32] = "This is a example!!";
const char* cp = s2; // 直接用指針,零拷貝、零函數調用
// 函數版:每次調用有開銷
int BIT_MASK(int bf) { return ((1U << bw##bf) - 1) << bs##bf; }
void SET_BITS(int dst, int bf, int val) { ... }
// 宏版:預處理器展開,零調用開銷
#define BIT_MASK(bf) (((1U << bw##bf) - 1) << bs##bf)
#define SET_BITS(dst,bf,val) ((dst) = ((dst) & ~BIT_MASK(bf)) | (((val) << bs##bf) & BIT_MASK(bf)))
// 求 1+2+...+100
// 迴圈版 O(N)
int sum = 0; for (int i=1; i<=100; i++) sum += i;
// 公式版 O(1)
int sum = 100 * (100 + 1) / 2;
// 除以 2 的冪次 → 右移
int div8 = x / 8; → int div8 = x >> 3;
int mod32 = x % 32; → int mod32 = x & 31; // x - (x >> 5 << 5) 等價
// 乘以 2 的冪次 → 左移
int mul8 = x * 8; → int mul8 = x << 3;
// 複製 1024 字節:C 迴圈 vs ARM 內嵌匯編
// C 版:1024 次迴圈
for (int i=0; i<1024; i++) dst[i] = src[i];
// ARM 內嵌匯編:LDMIA/STMIA 批量載入/存儲,128 次迴圈 (8 字節/次)
#ifdef __ARM__
__asm {
MOV R0, src
MOV R1, dst
MOV R2, #0
loop:
LDMIA R0!, {R3-R10} // 連續載入 8 個寄存器 (32 字節)
STMIA R1!, {R3-R10}
ADD R2, R2, #32
CMP R2, #1024
BNE loop
}
#endif
高效 C 編程的本質是**在正確性前提下,通過算法優化、編譯器協作、硬件特性利用,逐層消除冗餘**。四大招式由策略級到戰術級,靈活組合,方能在嵌入式、高頻交易、遊戲引擎、科學計算等領域榨乾每一個週期。