我做了幾個關于_alloca函式的搜索,一般不推薦使用。 我將有一個動態更新的字串陣列,我將不得不經常對其進行迭代。 我希望將每個字串分配到堆疊中,以盡可能地減少錯過的快取。
使用_alloca,我可以在堆疊上創建一個char*并將其放入向量中。 我的char將在一個向量中,這不會影響我的堆疊,而且我知道當我在堆疊中分配字串時,字串永遠不會大到足以使堆疊溢位。
這是否是一件壞事?
在這種情況下使用它是一件壞事嗎?
程式是否會做得更好?
該程式是否做了我想做的事?
該程式是否做了我想做的事?
#include <vector>
#include <cstring>
#ifdef __GNUC__
#define_alloca(size) __builtin_alloca (size)
#endif /* GCC。 */
std::vector<const char*> vec;
void add(const char* message, int size) {
char* c = (char*) _alloca (size * sizeof(char*) )。)
std::memcpy(c, message, sizeof(message))。
vec.push_back(c)。
}
int main() {
const char* c = "OK"。
for (int i = 0; i < 10; i) {
add(c, 2) 。
}
}
uj5u.com熱心網友回復:
當呼叫_alloca的函式回傳時,由_alloca分配的堆疊記憶體會自動釋放。事實上,一個指向它的指標被塞到某個地方(特別是某個向量)并不能阻止這段記憶體被釋放(正如你在評論中提到的你認為會發生的那樣),這不是C 的作業方式。在C 中沒有 "垃圾收集"。
因此,所示代碼最終存盤了一個指向被釋放的堆疊記憶體的指標。一旦add()回傳,就會留下一個懸空的指標,而隨后對它的任何使用都會導致未定義行為。
換句話說:是的,"在這種情況下使用它是一件壞事",因為所顯示的代碼將無法作業。
這個特定的_alloca呼叫還有其他幾個主要的問題,但這將是重點之外的問題。即使這些問題得到正確的解決,整個方法也會失敗。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/307847.html
標籤:
