内存分配粒度,页的大小,对齐

jadyzdr 2010-10-14 09:12:29
我知道现在的系统一般内存分配粒度是64kb,也的大小是4k,但是不明白他们分配的时候有个对齐,对于这个对齐怎么的原理,还有,分配粒度和页是用来干什么的,和内存分配什么关系,
...全文
769 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
riheyljh 2010-10-23
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 riheyljh 的回复:]

引用 1 楼 coding_hello 的回复:

这是个大话题,基本的原因就是效率。

同样是分配4kb内存,那么是从0x100000开始分配4k好呢,还是从0x100001开始分配4k好呢?这就是需要对齐的原因。


为什么要对齐呢,1楼的已经说了,是效率问题,其实你可以看看计算机原理的书籍,现代计算机读取内存的时候,一般只能在偶数边界上开始读,什么意思呢,我们打个比方,在32……
[/Quote]

然后这个变量的值就是前4个字节的后三位和后4个字节的第一位,这里应该前4个字节的后三个字节和后4个字节的第一个字节!
riheyljh 2010-10-23
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 coding_hello 的回复:]

这是个大话题,基本的原因就是效率。

同样是分配4kb内存,那么是从0x100000开始分配4k好呢,还是从0x100001开始分配4k好呢?这就是需要对齐的原因。
[/Quote]

为什么要对齐呢,1楼的已经说了,是效率问题,其实你可以看看计算机原理的书籍,现代计算机读取内存的时候,一般只能在偶数边界上开始读,什么意思呢,我们打个比方,在32位的机子上,一个int变量变量占用4字节,假如这个变量的真实物理内存地址是0x400005,那计算机在取数的时候会先从0x400004取4个字节,再从0x400008取4个字节,然后这个变量的值就是前4个字节的后三位和后4个字节的第一位,也就是说如果一个变量的地址从奇数开始,就可能要多读一次内存,而如果落在从偶数开始,特别是计算机位数/8的倍数开始,效率就高了!
jadyzdr 2010-10-20
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 hxfjb 的回复:]
个人感觉:
1 对齐和分配粒度类的问题,是相对于虚拟内存分配函数而言的,即virtualAlloc之类的函数。而对于在堆和栈上的内存,就没有这个问题。
2 对齐是上取整,假如你要在基地址为0x10的地方申请内存,那么分配出来的内存是从0x1010的地方开始的。
3 分配的粒度是内存最小分配大小。比如你在0x10的地方申请分配4097个字节的内存,那么实际分配的大小是4097/4k+4K=8K……
[/Quote]

4097/4k+4k=8k。这个怎么算的啊,4097/4k不是等于0吗
还有这句话“对齐是上取整,假如你要在基地址为0x10的地方申请内存,那么分配出来的内存是从0x1010的地方开始”为什么是从1010开始分配啊
hxfjb 2010-10-18
  • 打赏
  • 举报
回复
个人感觉:
1 对齐和分配粒度类的问题,是相对于虚拟内存分配函数而言的,即virtualAlloc之类的函数。而对于在堆和栈上的内存,就没有这个问题。
2 对齐是上取整,假如你要在基地址为0x10的地方申请内存,那么分配出来的内存是从0x1010的地方开始的。
3 分配的粒度是内存最小分配大小。比如你在0x10的地方申请分配4097个字节的内存,那么实际分配的大小是4097/4k+4K=8K的大小。
dxshenhua 2010-10-18
  • 打赏
  • 举报
回复
其实这个“对齐”的说法误导了很多人,比较容易理解的说法应该是向上取整。至于这个“整”是多少,可能是4个字节,也可能是4K.
野男孩 2010-10-16
  • 打赏
  • 举报
回复
这是个大话题,基本的原因就是效率。

同样是分配4kb内存,那么是从0x100000开始分配4k好呢,还是从0x100001开始分配4k好呢?这就是需要对齐的原因。

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧