From d03ca994387be0010ec8a9221fea2b5e6963711c Mon Sep 17 00:00:00 2001 From: Sander Speetjens Date: Sat, 4 Nov 2023 16:48:14 +0100 Subject: [PATCH] Memory optimize the 1d and 2d arrays --- src/safe_array.c | 20 ++------------------ src/safe_array.h | 12 ++++++------ 2 files changed, 8 insertions(+), 24 deletions(-) diff --git a/src/safe_array.c b/src/safe_array.c index 705dfba..2f77739 100644 --- a/src/safe_array.c +++ b/src/safe_array.c @@ -21,19 +21,12 @@ */ array_t *array_init(size_t size, size_t rows) { - array_t *arr = calloc(sizeof(array_t), 1); + array_t *arr = calloc(sizeof(array_t) + (size * rows), 1); if (!arr) { fprintf(stderr, "%s: Failed to allocate memory for array", __func__); return NULL; } - arr->data = calloc(size, rows); - if (!arr->data) - { - fprintf(stderr, "%s: Failed to allocate memory for data", __func__); - free(arr); - return NULL; - } arr->rows = rows; arr->size = size; @@ -103,7 +96,6 @@ void array_free(array_t *arr) { fprintf(stderr, "%s: ptr dereferences to NULL\n", __func__); } - free(arr->data); free(arr); } @@ -117,19 +109,12 @@ void array_free(array_t *arr) */ array_2d_t *array_2d_init(size_t size, size_t rows, size_t cols) { - array_2d_t *arr = calloc(sizeof(array_2d_t), 1); + array_2d_t *arr = calloc(sizeof(array_2d_t) + (size * rows * cols), 1); if (!arr) { fprintf(stderr, "%s: Failed to allocate memory for array", __func__); return NULL; } - arr->data = calloc(size, rows * cols); - if (!arr->data) - { - fprintf(stderr, "%s: Failed to allocate memory for data", __func__); - free(arr); - return NULL; - } arr->rows = rows; arr->cols = cols; @@ -205,7 +190,6 @@ void array_2d_free(array_2d_t *x) { fprintf(stderr, "%s: ptr dereferences to NULL\n", __func__); } - free(x->data); free(x); } diff --git a/src/safe_array.h b/src/safe_array.h index 5998a35..e5c5cbc 100644 --- a/src/safe_array.h +++ b/src/safe_array.h @@ -25,33 +25,33 @@ typedef struct array_s { - void *data; size_t rows; size_t size; + uint8_t data[1]; } array_t; typedef struct array_2d_s { - void *data; size_t rows; size_t cols; size_t size; + uint8_t data[1]; } array_2d_t; typedef struct array_c_s { - void *real; - void *imaginary; size_t rows; size_t size; + void *real; + void *imaginary; } array_c_s_t; typedef struct array_c_p_s { - void *magnitude; - void *phase; size_t rows; size_t size; + void *magnitude; + void *phase; } array_c_p_t; // Array.c