如何减少 C 中数组中当前未使用的保留内存?
How to reduce the reserved memory that is not currently being used in an array in C?
假设我们在C中为一个数组预留了32个字节,但结果我们只使用了24个字节,如何减少当前未使用的预留内存?这可能吗?
我没有使用 malloc,但我可以。
这是最小的可复制示例:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int main() {
FILE *input;
input = fopen("1.txt", "r");
int arr[4][300];
if (input == NULL) {
printf( "ERROR. Coundn't open the file.\n" ) ;
} else {
for (int i = 0; i < 300; i++) {
fscanf(input, "%d %d %d %d", &arr[0][i], &arr[1][i],
&arr[2][i], &arr[3][i]);
}
fclose(input);
int sze = 0;
for (int i = 0; i < 300; i++) {
for (int j = 0; j < 4; j++) {
if (abs(arr[j][i]) >= 1)
sze += log10(abs(arr[j][i])) + 1;
else
sze++;
if (arr[j][i] < 0)
sze++;
}
}
printf("Size %d kB\n", sze);
}
return 0;
}
澄清:我需要的是尽可能减少数组中每个元素使用的内存。假设我存储了数字 45,它不会占用 int 的所有 4 个字节,所以我需要减少分配给 1 个字节的内存。正如我所说,我目前没有使用 malloc,但如果有办法实现我想要的,我可以切换到 malloc。
如果要减少某个值的使用 space,您需要将其分配给不同类型的对象。
在您的示例中,您从一个 int
开始,它可能在您的系统上使用 4 个字节。然后在其中存储值“45”,它只需要一个字节。大小为 1 字节的类型例如 int8_t
或 signed char
.
首先,变量的类型一旦定义就无法更改。您可以将其存储在 另一个 变量中。
其次,数组的所有元素必须是同一类型。
所以给定示例的答案只是“否。”
如果你想“压缩”存储的值,你需要滚动你自己的类型。您可以发明某种“向量”,以尽可能少的字节存储每个值。您还需要存储每个值的大小。并且您需要对每个矢量元素实现访问功能。这不是一个简单的任务。
假设我们在C中为一个数组预留了32个字节,但结果我们只使用了24个字节,如何减少当前未使用的预留内存?这可能吗?
我没有使用 malloc,但我可以。
这是最小的可复制示例:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int main() {
FILE *input;
input = fopen("1.txt", "r");
int arr[4][300];
if (input == NULL) {
printf( "ERROR. Coundn't open the file.\n" ) ;
} else {
for (int i = 0; i < 300; i++) {
fscanf(input, "%d %d %d %d", &arr[0][i], &arr[1][i],
&arr[2][i], &arr[3][i]);
}
fclose(input);
int sze = 0;
for (int i = 0; i < 300; i++) {
for (int j = 0; j < 4; j++) {
if (abs(arr[j][i]) >= 1)
sze += log10(abs(arr[j][i])) + 1;
else
sze++;
if (arr[j][i] < 0)
sze++;
}
}
printf("Size %d kB\n", sze);
}
return 0;
}
澄清:我需要的是尽可能减少数组中每个元素使用的内存。假设我存储了数字 45,它不会占用 int 的所有 4 个字节,所以我需要减少分配给 1 个字节的内存。正如我所说,我目前没有使用 malloc,但如果有办法实现我想要的,我可以切换到 malloc。
如果要减少某个值的使用 space,您需要将其分配给不同类型的对象。
在您的示例中,您从一个 int
开始,它可能在您的系统上使用 4 个字节。然后在其中存储值“45”,它只需要一个字节。大小为 1 字节的类型例如 int8_t
或 signed char
.
首先,变量的类型一旦定义就无法更改。您可以将其存储在 另一个 变量中。
其次,数组的所有元素必须是同一类型。
所以给定示例的答案只是“否。”
如果你想“压缩”存储的值,你需要滚动你自己的类型。您可以发明某种“向量”,以尽可能少的字节存储每个值。您还需要存储每个值的大小。并且您需要对每个矢量元素实现访问功能。这不是一个简单的任务。