- 论坛徽章:
- 2
|
回复 13# xyfree
>> 问题就是在于mmap 之类的东西,你不能假设整个地址空间都归你管理……
>> 所以只要存在其他可能影响内存空间分布的东西,你就无法保证内存块的地址一定符合条件。
先说 VirtualAlloc。 妈逼VirtualAlloc又两个粒度…… 这里只说提交粒度。。。
不管用户如何用 VirtualAlloc/CreateFileMapping或者其他更高层的分配接口。
但只要你是用 VirtualAlloc 获得的内存, 那肯定是在页边界上的, 大小肯定是页的整数倍。
总共就2^32/2^12=2^20个页(且按4G算,实际只有2-3G)。
用一个1M元素的指针数组管理就完了……
比如你从 VirtualAlloc 得到了 [x*2^12, x*2^12+4k), 就把管理这4k内存的数据的地址放到那个数组的 x 项里……
如果是 [y*2^12, y*2^12+8k) 那就把管理这8k内存的数据的地址放到 y, y+1 项目里……
查询时直接右移12位得到index……
用户不是通过你的接口分配的话, 对应的元素就等它空着……
tcmalloc 一启动就占用4M地址空间就是这么来的……
而mmap, 它是个规范, 而且对起始地址的边界说得很含糊……
但说到具体实现, 比如linux+glibc经过测试就是在页边界的, 也可以这么搞……
虽然很占内存, 但这是最快(常数时间)的方法了…… |
|