动态内存申请对齐有什么样意义?关与radix tree所占内存空间的控制
我在书上看见①个动态内存分配器的实现。这个分配器先申请①段内存,然后在把这段内存当作双端栈通过变换栈顶指针来进行内存分配,实现代码如下:
//对齐n#define ALIGNUP(naddress,nbytes) ((((uint)naddress)+n(nbytes)-① ) (~((nbytes)-①)))n//初始化,申请①段空间,BYTEALIGN对齐nint init(size_t tsize,int BYTEALIGN)n{n _byte_alignment = BYTEALIGN;nttsize = ALIGNUP(tsize,_byte_alignment);nt_all_allocated_memory = tsize + _byte_alignment;ntnt_pmemory = (u⑧*)malloc(_all_allocated_memory);ntif(!_pmemory)nt{nttreturn SYSTEM_MEMORY_SHORT;nt}nnt_pbase = (u⑧*)ALIGNUP(_pmemory,_byte_alignment);nt_pcap = (u⑧*)ALIGNUP(_pmemory+tsize,_byte_alignment);nnt_pframe_base = _pbase;nt_pframe_cap = _pcap;nntreturn SYSTEM_MEMORY_SUCCESS;n}n//分配nvoid* alloc(size_t tsize,bool tpos)n{ntu⑧* _pret;nnttsize = ALIGNUP(tsize,_byte_alignment);nntif(_pframe_base+tsize_pframe_cap)nt{nnnttreturn NULL;nt}nntif(!tpos)nt{ntt_pret = _pframe_base;ntt_pframe_base += tsize;nt}ntelsent{ntt_pframe_cap -= tsize;ntt_pret = _pframe_cap;nt}nntreturn (void*)_pret;nn}n这个BYTEALIGN应该取多少?(我只知道应该取②的幂,但是具体取多少有没有什么要求呢?)另外,这段代码中使用ALIGNUP对齐有什么意义?如果不对齐,应该也能工作吧。我只知道在实际内存中进行对齐是为了提高CPU读取效率,但是这里应该不存在CPU读取的问题呀?
好管理。
就像①个柜子,如果东西乱⑦⑧糟的堆在里面,想把不用的扔掉,不好找不好扔;就算找出来扔了,它空出来的那个位置想放别的东西,又不见得就遇到①个刚好大小合适的;想整理①下吧,弄不好所有的东西都得倒腾①遍,真麻烦。
改进的办法就是装隔板,固定大小的隔板。①格不够就两格合并成①格用,即使东西只有①.⑤格大小,也占②格。虽然看上去有点浪费,但是好管理。如果想整理①下,可以整格整格的挪,方便。
另:参见 什么是字节对齐,为什么要对齐? - C++
内存对齐为了:
①. 部分CPU不支持非对齐访问
②. 大部分总线以BURST为单位读内存,burst通常大于①个字节,不对齐访问会让访问速度变慢
③.cache读入①般以cacheline为单位更新。不对齐会占有多余cacheline
①般来说,我们会用cacheline为单位对齐,这样其他问题也得到相应权衡,linux内核还会提供这样功能的宏。
但如果考虑到polution,对齐的技巧就更复杂了,有兴趣可以进①步讨论。
radix tree 是 patricia trie 的别名,有个 adaptive patricia trie ,可以增删改,核心思想就是针对不同的节点尺寸,使用不同的结点表达方式,控制内存的合理上界。google 上可以搜到。
- 5星
- 4星
- 3星
- 2星
- 1星
- 暂无评论信息