【发布时间】:2018-06-22 03:49:13
【问题描述】:
问题如下:
我将 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 的开销。
有什么想法吗?我需要避免动态内存分配。
【问题讨论】:
-
您需要分配足够的内存来处理最坏的情况,仅此而已。分配比“有时”少的内存是没有意义的。您的程序要么可以处理最坏的情况,要么不能。
-
不要想象问题,触发它们,然后解决它们。
-
30 是一个非常小的数字。不要为“内存浪费”而烦恼,除非您的设备上的内存真的很少。
-
在不浪费内存的情况下,为最坏的情况提供足够的字节......听起来就像一只猫在咬自己的尾巴。请考虑区分平均情况和最坏情况是很常见的。如果您必须为最坏的情况做好准备,那么对浪费内存的怀疑......有点没用。您可以考虑优化使用位。 64 个不同的错误代码可以存储在 6 位而不是 8 位中。使用lossless data compression 可能更有效,但在不了解可能数据的确切特征的情况下,无法预测准确/最差压缩率。
-
我经常与新手嵌入式程序员进行这样的讨论。最重要的是,他们永远不会真正知道他们“存钱”是为了什么。下雨天之类的。 “拥有这些字节可能很好”不是常识。有什么用?