Tôi có một hàm trong C tự động phân bổ bộ đệm, được chuyển đến hàm khác để lưu trữ giá trị trả về của nó. Một cái gì đó giống như ví dụ giả sau đây:Con trỏ tĩnh đến bộ đệm được cấp phát động bên trong hàm
void other_function(float in, float *out, int out_len) {
/* Fills 'out' with 'out_len' values calculated from 'in' */
}
void function(float *data, int data_len, float *out) {
float *buf;
int buf_len = 2 * data_len, i;
buf = malloc(sizeof(float) * buf_len);
for (i = 0; i < data_len; i++, data++, out++) {
other_function(*data, buf, buf_len);
/* Do some other stuff with the contents of buf and write to *out */
}
free buf;
}
function
được gọi bằng một iterator qua một mảng đa chiều (đó là một gufunc kernel NumPy, để được chính xác), vì vậy nó được gọi là hàng triệu lần với cùng một giá trị data_len
. Có vẻ như lãng phí để tạo ra và phá hủy bộ đệm hơn và hơn nữa. Tôi thường di chuyển việc cấp phát bộ đệm cho hàm gọi function
và chuyển poiinter cho nó, nhưng tôi không trực tiếp kiểm soát điều đó, vì vậy không thể. Thay vào đó, tôi đang xem xét cách làm như sau:
void function(float *data, int data_len, float *out) {
static float *buf = NULL;
static int buf_len = 0;
int i;
if (buf_len != 2 * data_len) {
buf_len = 2 * data_len;
buf = realloc(buf, sizeof(float) * buf_len); /* same as malloc if buf == NULL */
}
for (i = 0; i < data_len; i++, data++, out++) {
other_function(*data, buf, buf_len);
/* Do some other stuff with the contents of buf and write to *out */
}
}
đó có nghĩa là tôi không bao giờ trực tiếp giải phóng bộ nhớ tôi phân bổ: nó được tái sử dụng trong các cuộc gọi tiếp theo, và sau đó lưu lại đó cho đến khi thoát chương trình của tôi. Nó không có vẻ giống như việc phải làm, nhưng cũng không quá tệ, vì lượng bộ nhớ được phân bổ luôn nhỏ. Tôi có quá lo lắng không? Có cách tiếp cận tốt hơn cho điều này?
Bạn có guarentees nào về kích thước của bộ đệm động không? –
không có raii trong C, có thể trình biên dịch bạn sử dụng có phần mở rộng raii như trong gcc: http://gcc.gnu.org/onlinedocs/gcc/Variable-Attributes.html –
@JustinMeiners Có, nó được kiểm soát rất chặt chẽ. Tối đa là 65536 mặt hàng, nhưng đó là hiếm, thường dài 16 hoặc 32 mặt hàng. – Jaime