Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 具有静态堆的小数据块(典型<;=16字节,罕见>;=64字节,最大值=192)的内存分配器_C_Memory_Memory Management_Allocator - Fatal编程技术网

C 具有静态堆的小数据块(典型<;=16字节,罕见>;=64字节,最大值=192)的内存分配器

C 具有静态堆的小数据块(典型<;=16字节,罕见>;=64字节,最大值=192)的内存分配器,c,memory,memory-management,allocator,C,Memory,Memory Management,Allocator,此分配器将在具有静态内存的嵌入式系统中使用(即,没有可用的系统堆,因此“堆”将只是“char heap[4096]”) 似乎有很多“小内存分配器”,但我正在寻找一个处理非常小的分配。我说的是典型的16字节大小,CPU使用量和内存使用量都很小 考虑到典型的分配规模是OP:有人能在我的理论上捅破洞吗 在阅读上半部分时,我想出了一个使用位数组记录使用情况的解决方案,并有效地提出了与您在下半部分概述的内容相同的内容 因此,这里是一个漏洞:避免硬编码一个16位块。允许位图在开发开始时使用,例如20或24字

此分配器将在具有静态内存的嵌入式系统中使用(即,没有可用的系统堆,因此“堆”将只是“char heap[4096]”)

似乎有很多“小内存分配器”,但我正在寻找一个处理非常小的分配。我说的是典型的16字节大小,CPU使用量和内存使用量都很小


考虑到典型的分配规模是OP:有人能在我的理论上捅破洞吗

在阅读上半部分时,我想出了一个使用位数组记录使用情况的解决方案,并有效地提出了与您在下半部分概述的内容相同的内容

因此,这里是一个漏洞:避免硬编码一个16位块。允许位图在开发开始时使用,例如20或24字节块。在此期间,您可能希望在块的边缘放置标记信息和哨兵。因此,您可以更容易地跟踪double free()、分配外使用等。当然,价格是一个较小的有效池

在调试阶段之后,自信地使用16字节解决方案


一定要跟踪0OP:有人能在我的理论上捅破洞吗

在阅读上半部分时,我想出了一个使用位数组记录使用情况的解决方案,并有效地提出了与您在下半部分概述的内容相同的内容

因此,这里是一个漏洞:避免硬编码一个16位块。允许位图在开发开始时使用,例如20或24字节块。在此期间,您可能希望在块的边缘放置标记信息和哨兵。因此,您可以更容易地跟踪double free()、分配外使用等。当然,价格是一个较小的有效池

在调试阶段之后,自信地使用16字节解决方案


确保跟踪0为什么需要动态分配开始?只要有可能,静态分配可能更容易、更有效。我通常同意,但有一个问题,内存不足!听起来很奇怪,我知道,所以让我解释一下。在以前的应用程序中,它可以同时从多达16个“节点”接收数据,因此我们只需分配192*16=3072字节的RAM。现在节点的数量激增到64个,但我们没有64*192=12288字节的RAM备用。但是,所有64个节点希望同时发送数据的可能性为零,因此我决定不进行静态分配,而是在需要时进行动态分配,以减少所需的内存量。如果你能想出另一个解决方案,我洗耳恭听。为什么你一开始就需要动态分配?只要有可能,静态分配可能更容易、更有效。我通常同意,但有一个问题,内存不足!听起来很奇怪,我知道,所以让我解释一下。在以前的应用程序中,它可以同时从多达16个“节点”接收数据,因此我们只需分配192*16=3072字节的RAM。现在节点的数量激增到64个,但我们没有64*192=12288字节的RAM备用。但是,所有64个节点希望同时发送数据的可能性为零,因此我决定不进行静态分配,而是在需要时进行动态分配,以减少所需的内存量。如果你能想出另一个解决方案,我洗耳恭听。因此,基本上在每个分配的开始和结束添加类似0xDEADBEEF的内容,并确保在释放块时它们仍然存在,以确保堆不会被溢出或下溢的缓冲区损坏。还可以使用模式填充释放的块,并通过将其分配给其他人来确保其仍然是相同的模式。一个好主意。@squidge每个分配块,我会在前端添加一个(字节计数-1)和唯一的哨兵,在字节计数端添加一个唯一的哨兵。如前所述,用于释放的块。指标也很好(最糟糕的情况是alloc用法等)不允许alloc(0)。显然,确保激活/停用此开销本身不会导致不可预见的问题。考虑到特殊的需求,如果您找到现成的代码,我会感到惊讶,但可能是一个模板?因此基本上在每个分配的开始和结束添加类似0xDEADBEEF的内容,并确保在释放块时它们仍然存在,以确保堆不会被溢出或下溢的缓冲区损坏。还可以使用模式填充释放的块,并通过将其分配给其他人来确保其仍然是相同的模式。一个好主意。@squidge每个分配块,我会在前端添加一个(字节计数-1)和唯一的哨兵,在字节计数端添加一个唯一的哨兵。如前所述,用于释放的块。指标也很好(最糟糕的情况是alloc用法等)不允许alloc(0)。显然,确保激活/停用此开销本身不会导致不可预见的问题。考虑到特殊的需求,如果你能找到现成的代码,我会很惊讶,但也许是一个模板?