我在c
中有一個工作函數實現,它需要大量本地分配的內存塊作爲工作空間。在保證所需的工作空間量不會改變的情況下,該函數會被連續調用。爲了優化函數,我重新構造了它在第一次被調用時分配一個靜態單個連續的內存塊,只有當它被要求時纔會釋放它。它看起來是這樣的將c實現的靜態分配的工作區轉換爲C++
void worker(struct* ptr, size_t m) {
static double *stack;
static size_t sz_stack;
static double *alpha;
static double *delta;
if (!ptr) {
if (stack) {
free(stack);
}
stack = NULL;
sz_stack = 0;
return;
}
if (!stack) {
sz_stack = 2*m;
stack = calloc(sz_stack, sizeof(*stack));
if (stack==NULL)
// Error and cleanup
alpha = stack;
delta = alpha + m;
}
// Do work using alpha and delta as arrays
return;
}
調用者可以先後調用這個函數,其中ptr
將只要通過m
給出的問題的規模不會改變持有最終結果。當呼叫者完成該功能或問題大小改變時,他呼叫worker(NULL, 0);
,分配的內存將被釋放。
我現在正在改寫這個代碼庫c++
和最佳實踐告訴我,我已經使用個人std::vector
爲alpha
和delta
,而不是連續stack
。然而,性能分析表明存在巨大的瓶頸,因爲容器分配和釋放了每個函數調用。現在
我的問題是:
什麼是保持一個連續的一塊在調用之間的函數工作空間的現代c++
方式?
如果你不需要手動釋放內存,你可以有一個'static std :: vector'。 –
或者,也許你可以使用一個自定義分配器來保存緩衝區,從而可以快速「分配」內存。 –