C 最佳内存分配

C 最佳内存分配,c,logic,analytical,C,Logic,Analytical,我有200个小组。每组有100台设备,即总共20000台设备,分为200组,每组100台 现在,当每个设备向服务器注册时,服务器会为设备分配一个组id。(100个设备具有相同的组id。)在稍后阶段,服务器发送具有组id的多播数据,以便将数据接收到具有该组id的所有设备 问题是,我需要为每个组分配一块内存(比如说25字节)来存储数据,以便该组中的所有设备将使用该块进行处理。我的想法是分配一个大数据块(比如25*200=5000字节),并为每组分配一个25字节的数据块(grp0点到起始地址,grp1

我有200个小组。每组有100台设备,即总共20000台设备,分为200组,每组100台

现在,当每个设备向服务器注册时,服务器会为设备分配一个组id。(100个设备具有相同的组id。)在稍后阶段,服务器发送具有组id的多播数据,以便将数据接收到具有该组id的所有设备

问题是,我需要为每个组分配一块内存(比如说25字节)来存储数据,以便该组中的所有设备将使用该块进行处理。我的想法是分配一个大数据块(比如25*200=5000字节),并为每组分配一个25字节的数据块(grp0点到起始地址,grp1点到起始地址+25地址等等)


这是最好的方式吗?还有其他想法吗?

正如ArjunShankar所说,您需要O(1)个时间来访问组中的一个设备,如果您不需要处理太多来查找特定设备(假设您必须找到它),这也不错。如果您计划同时处理它们,并且数量越来越大(或者您的可用内存有限),您应该看看一些技术,例如磁盘分页。

对于您的示例,我将使用阵列

如果客户端数量不变,则分配单个块是最有效的方法:

  • 你只做一次malloc调用,而不是100次
  • 您可以避免与跟踪每个内存块分配的列表相关联的开销
  • 您的数据保存在一块中,与放置在哪里的100个小数据块相比,处理器缓存更容易缓存数据
尽管如此,可能只有100个元素的差异可以忽略不计,但乘以200组可以提高性能(实际上取决于您如何使用数据结构)


如果是动态结构(例如,您的客户端连接和断开连接,因此它们并不总是100个),您应该使用链表-在需要时分配内存(因此您最终会有100个不同的内存块)

让我们看看:您希望通过数组中的索引查找组
g
。这需要
O(1)
time=>很好。您想要分配一个5KB的内存块。这不算太多=>好。确保分配
(200*sizeof(struct group))
字节,而不是'5000':)您所说的“最佳”是什么意思?最好的方法是什么?另外:阵列提供了空间位置(有利于缓存)等优势。即使是在其他情况下,我也希望从100个元素的链表中间获取内容所需的周期数会有一个数量级的差异,并通过数组中的偏移地址获取相同的内容。