初學者實作經典的 InvSqrt(Quake III 快速逆平方根)並嘗試計時比較,卻發現 count_1() 和 count_2() 完全不執行。
void main() {
printf("請輸入一個值");
scanf_s("%f", &x);
float count_1(); // ❌ 這是「宣告」一個回傳 float 的函數原型
float count_2(); // ❌ 同理
system("pause");
}
C/C++ 允許在區塊內宣告函數原型,編譯器不報錯,但這兩行只是告訴編譯器「有這兩個函數」,並不會執行它們。
void main() {
printf("請輸入一個值");
scanf_s("%f", &x);
count_1(); // ✅ 真正呼叫
count_2(); // ✅ 真正呼叫
system("pause");
}
InvSqrt 使用了型別雙關((int*)&x),屬於未定義行為(UB),現代編譯器優化下可能失效。建議改用 std::bit_cast (C++20) 或 memcpy。clock() 精度極低,微秒級計時請用 std::chrono::high_resolution_clock。void main() 非標準,應為 int main()。#include <chrono>
#include <cmath>
#include <cstdio>
float InvSqrt(float x) {
float xhalf = 0.5f * x;
int i = std::bit_cast<int>(x); // C++20
i = 0x5f3759df - (i >> 1);
x = std::bit_cast<float>(i);
x = x * (1.5f - xhalf * x * x);
return x;
}
int main() {
float x;
printf("請輸入一個值: ");
scanf("%f", &x);
auto t1 = std::chrono::high_resolution_clock::now();
float r1 = 1.0f / std::sqrt(x);
auto t2 = std::chrono::high_resolution_clock::now();
printf("std::sqrt 耗時: %.3f μs\n",
std::chrono::duration<double, std::micro>(t2 - t1).count());
auto t3 = std::chrono::high_resolution_clock::now();
float r2 = InvSqrt(x);
auto t4 = std::chrono::high_resolution_clock::now();
printf("InvSqrt 耗時: %.3f μs\n",
std::chrono::duration<double, std::micro>(t4 - t3).count());
printf("結果對比: %.6f vs %.6f\n", r1, r2);
return 0;
}
記住:宣告不是呼叫,這是新手最容易踩的坑之一。