如何决定选择不同类型的容器?

时间:2014-08-12 16:11:09

标签: c++ c linux qt arm

我正在为运行Linux的嵌入式平台(ARM11)编写软件。该软件应该可以长时间(数月)工作而无需关闭/重新打开,并且大多数每个嵌入式平台都缺少RAM(操作系统和用户程序总共250兆字节)。该设备通过串口连接到另一台设备,它们以ping的形式连续(每300毫秒)通信,用于状态,错误,报警等。该设备用于在高流量区域的门上进行访问控制百人将使用MIFARE卡作为识别手段。我想过使用动态容器来保存包含通信包和卡数据的对象(因为它们可以有不同的大小,从几个字节到一个千字节),当然这些对象会不断被创建和销毁,并且它们不会被赢得。停留很长时间(具有功能范围)。我选择的语言是C ++,我将Qt用于库。此外,所有数据元素都是无符号的8位字符。

  • 不使用此类容器导致内存碎片问题?
  • 因为容器的最大尺寸已知,使用C型容器(如数组和结构)以获得更好的性能会更好吗?
  • 选择合适的容器是否有经验法则?

修改 mifare卡包含1千字节的内存(1024字节),分为16个扇区,每个扇区包含4 * 16字节块。在读取操作中,返回至少一个数据块,我将需要从该块中提取低至一位的信息,并且我搜索从非接触式卡获得的数据的方式将是通过提供给我的程序的参数文件这澄清了卡数据的映射和掩码。

1 个答案:

答案 0 :(得分:1)

这些条件下的主要挑战是内存碎片。一个主要原因是在分配中混合对象大小,并在不同时间释放它们。有一些有效的技术来对抗这种情况。

对于初学者来说,如果你有许多固定大小的小对象(比如28),那么这个大小对象的专用分配器会有所帮助。它本身不会导致真正的碎片,你只需要一个空闲块的位图,并分配你可以选择第一个空闲块。

对于字符串,将其大小进行舍入是有意义的,例如:到2的倍数,然后用\0填充数据。然后,您可以为8/16/32/64 /等尺寸配备专用分配器。你将浪费不超过100%,实际上它接近40%(取决于字符串长度分布)。对于短字符串,请使用小字符串优化 - 检查std::string和/或QString是否使用它,如果不使用您自己的字符串类型可能是可取的。

C类型容器(例如malloc'ed数组通常做得很差,正是由于上面提到的原因:太容易以任意随机长度生成它们。 std::vector通常以很好的固定增量增长。但是,请检查它是否将reserve请求舍入到合理的数量(2的幂,或4KB的倍数,无论什么更小)。如果没有,你应该。