gpt4 book ai didi

c++ - 如何在选择不同类型的容器之间做出决定?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:56:45 26 4
gpt4 key购买 nike

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

  • 使用这样的容器不会造成内存碎片问题吗?
  • 既然容器的最大大小是已知的,那么使用 C 类型的容器(如数组和结构)以获得更好的性能不是更好吗?
  • 是否有选择合适容器的经验法则?

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

最佳答案

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

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

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

C 类型的容器,如 malloced 数组通常表现很差,正是由于上述原因:生成任意长度的它们太容易了。 std::vector 通常以很好的固定增量增长。但是,检查它是否将 reserve 请求舍入到合理的数量(2 的幂,或 4KB 的倍数,取较小者)。如果没有,你应该。

关于c++ - 如何在选择不同类型的容器之间做出决定?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25269157/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com