问题如下:
我将ID为(e.g. 23,53,12,64...)
的错误代码存储在具有预定义长度(e.g. 10)
的数组中。
现在我想为这些代码存储一些额外的字节
(e.g. **23** (data: 102, 340), **53** (data: 10), **12** (data: 46, 23, 64, 12), **64** (data: 1,2,3))
。
几乎每个错误代码的数据长度都不同。
关于内存消耗,存储这些额外字节的最佳方法是什么?
我的想法是计算存储这些额外字节所需的最大内存。
如果我有30个错误代码,并且希望能够存储10个错误代码(如果它们发生了),那么可以通过累加以下代码的额外字节数来计算用于存储额外字节的最大内存:那些需要最多额外字节的错误代码。因此,当发生10个错误(它们需要最多的额外字节)时,用于存储额外字节的数组就足够了。
一个错误代码一次只出现一次。
发生错误时,我将其他字节保存到该数组中,并向错误代码存储一个“指针”(这只是该数组的索引),在此附加字节开始。
但是,如果发生错误,这会导致碎片,并且我会删除错误。
对该数组进行碎片整理将是CPU的开销。
有什么想法吗?我需要避免动态内存分配。
答案 0 :(得分:0)
听起来您有一个数组存储错误ID,而另一个数组存储所有错误的其他字节。 (并且您还有另一个数组来存储指向每个错误的其他字节的指针吗?)您所关心的是管理additional_bytes数组和指针。是吗?
与其将单独的数组与指针一起使用,不如将所有内容存储在单个结构数组中。
首先声明一个结构,其中包含与错误有关的所有信息。
typedef struct ErrorInfo
{
unsigned int error_id;
uint8_t additional_data[MAX_ADDITIONAL_BYTES_PER_ERROR];
} ErrorInfo;
然后分配一个数组来存储多个错误。
ErrorInfo errors_array[MAX_NUMBER_OF_ERRORS];
设置这样的错误:
errors_array[0].error_id = 23;
errors_array[0].additional_data[0] = 102;
errors_array[0].additional_data[1] = 340; <--- Note that 340 will overflow a byte!
这将比设计占用更少的内存,因为您不再需要为每个错误记录指向其他字节的指针。这也消除了碎片整理问题,因为每个错误的其他字节在struct数组中都有保留的位置,并且您不再需要在单独的additional_bytes数组中管理它们的位置。
如果必须将所有错误的所有其他字节存储在单独的数组中,则只需对每个错误使用固定(永久)偏移量。错误编号为n
的附加字节的偏移量等于(n - 1) * MAX_ADDITIONAL_BYTES_PER_ERROR
。这将在两次错误之间在数组中留下一些空字节,但是它将消除存储指针和管理碎片的需要。
答案 1 :(得分:-1)
对于不动态更改数据的只读解决方案,我会考虑使用游程方法。代码,长度,数据[长度],代码,长度,数据[长度]等...
这访问起来很慢,但是如果您没有索引,那么您也将不得不遍历数组以查找所需的代码。
您可以编写一个小程序,在主机而不是目标上进行编码,然后将数组作为C代码打印到文件中。主机将使用一种浪费的方法,其中数据大小是您将遇到的最大大小。