“我跟你們說,你們知道STL容器,vector/string/deque等等,都有個reserve方法嗎?你們一個個地push_back,嫌C++比C慢,怪誰?”
“要像我這樣,預先分配足夠大的空間,這樣push_back的時候才快,明不明白?”
“別老說寫C比寫C++好,因為C代碼怎么運行的都在自己掌控之中,還快,那是因為你們不懂C++。”
----------------------------------------------------------------------------------------------------------------------------------------
#include <cstdio> #include <vector> using namespace std; struct Node { int i = 0; Node* next = nullptr; Node(int _i) : i(_i) { } }; const int N = 3; // 某人以為的"足夠大"的數 vector<Node> odd; // 存放偶數: 0,2,4,6... // 偶數節點指向比自己大1的奇數節點 vector<Node> even; // 存放奇數: 1,3,5,7... // 奇數節點指向比自己小1的偶數節點 // 於是對於Node node, 只需調用node.next->i就能實現node.i ^ 1這樣的亦或運算 // [不要考慮這個功能意義在哪] void init() // 初始化, 兩個vector都申請"足夠多"的空間 { odd.reserve(N); even.reserve(N); } void add() { if (!even.empty()) { even.push_back(odd.back().i + 1); // 插入2n+1 odd.push_back(even.back().i + 1); // 插入(2n+1)+1=2n+2 } else { even.push_back(0); odd.push_back(1); } odd.back().next = &even.back(); // 2n+1指向2n+2 even.back().next = &odd.back(); // 2n+2指向2n+1 } void XOR_Simulate() { for (int i = 0; i < 3; i++) add(); printf("%d ^ 1 = %d\n", odd[0].i, odd[0].next->i); printf("%d ^ 1 = %d\n", even[0].i, even[0].next->i); } int main() { init(); printf("run XOR_Simulate()\n"); XOR_Simulate(); printf("OK, now, run XOR_Simulate() again!\n"); XOR_Simulate(); return 0; }
直接上代碼,貼幾個運行結果
唉,都不想多說了,我今天還就踩了這么弱智的陷阱。只不過在較多的代碼中沒有正確地找到原因。
這種隱藏的錯誤剛開始的時候不會出現什么問題,而到了后面,這顆定時炸彈被引爆的時候,只能手足無措地看着segmentation fault或者由於abort()以錯誤free() invalid next size開頭的一大段Memory Map信息。