社区
进程/线程/DLL
帖子详情
内存分配粒度,页的大小,对齐
jadyzdr
2010-10-14 09:12:29
我知道现在的系统一般内存分配粒度是64kb,也的大小是4k,但是不明白他们分配的时候有个对齐,对于这个对齐怎么的原理,还有,分配粒度和页是用来干什么的,和内存分配什么关系,
...全文
889
6
打赏
收藏
内存分配粒度,页的大小,对齐
我知道现在的系统一般内存分配粒度是64kb,也的大小是4k,但是不明白他们分配的时候有个对齐,对于这个对齐怎么的原理,还有,分配粒度和页是用来干什么的,和内存分配什么关系,
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用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好呢?这就是需要对齐的原因。
cma.rar_return
Find a PFN aligned to the specified order and return an offset represented in order_per_bits.
内存分配
粒度
vs内存分
页
大小
vs内存空间
当请求一块内存的时候,系统每次分配出来的内存空间的最小度为分配粒,这个分配
粒度
就是
对齐
值,32位机器上是64K
大小
; 而分
页
时,每一
页
在32位机器上是4K,当需要6K的时候,它会将这6K的数据放在两
页
中,一
页
4K,一
页
2K,可能是为了下次再有需要,可以直接扩大,每次会给你64K 的空间,也就会有64-6=58K的空间是给你预留的,暂时不用。
C++
内存分配
与内存
对齐
一、C++程序
内存分配
C/C++程序编译时内存分为5大存储区 栈区,由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。通俗来讲就是函 数中的变量参数等等,即{}中的内容。 堆区,一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方 式倒是类似于链表。通俗讲就是动态
内存分配
, 全局区(静态区),—,全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域(RW),
字节
对齐
/内存
对齐
/
对齐
粒度
其实标题里面的三个关键字说的都是同一个东西。也就是C++中类和结构体在内存中的分配策略,专业术语可以称之为“
对齐
模数(Alignment Modules)”。
对齐
模数分为三类: 1.自身
对齐
模数,也就是类或结构体中成员的
大小
,1,2,4,8之中的一个,对应BYTE WORD DWORD QWORD。 2.指定
对齐
模数,也就是IDE指定的默认
对齐
模, 在MS系列IDE中,默认为8。不过
内存
对齐
(字节
对齐
)两三事
目录什么是内存
对齐
为什么要内存
对齐
怎么内存
对齐
示例字节
对齐
算法ios获取内存
大小
sizeofclass_getInstanceSizemalloc_size 什么是内存
对齐
先看下面这个结构体 struct Test{ int a; char b; }; 如果没有内存
对齐
,在64位机器上(以后不作说明,均是64位)字节内存
大小
应是: 4 + 1 = 5 而实际使用sizeof(struct Test)输出却得到的是8 为什么要内存
对齐
1)平台原因(移植原因):不是所有的硬件平台都能访问任
进程/线程/DLL
15,473
社区成员
49,171
社区内容
发帖
与我相关
我的任务
进程/线程/DLL
VC/MFC 进程/线程/DLL
复制链接
扫一扫
分享
社区描述
VC/MFC 进程/线程/DLL
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章