内存对齐?

lcyw
百度研发工程师
博客专家认证
2011-05-18 12:40:01
1, 内存分配的时候,为什么要内存对齐,

加入, 要分配4096BYTE大小内存, 以16字节对齐, 怎么做?

2
...全文
195 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
cxyOOOO 2011-05-18
  • 打赏
  • 举报
回复
非对齐的跨页问题呢?
大熊猫侯佩 2011-05-18
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 pengzhixi 的回复:]

1.某些平台要求对齐有利于提高访问速度,而且如果不对齐可能出现访问错误。
[/Quote]

intel常规架构下,可以无视
赵4老师 2011-05-18
  • 打赏
  • 举报
回复
这是“老大”CPU的要求。
dg393624170 2011-05-18
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 pengzhixi 的回复:]
引用 5 楼 machh 的回复:
如果 要分配4096 BYTE大小的内存, 以16字节对齐, 怎么做?


比如4096多分配16个字节,然后,将返回地址按照16的倍数对齐就可以了。
大概是这样:
char*p=(char*)malloc(4096+16);
char*q=(char*)(((unsigned int)p+16)&(~0XF));
[/Quote]
对齐的意思是:不管你需要多少,大都是以对齐大小的值来分,每次都是16,知道够用为止;即使最后只有一个字节,他还是会分配16个字节;
pengzhixi 2011-05-18
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 machh 的回复:]
如果 要分配4096 BYTE大小的内存, 以16字节对齐, 怎么做?
[/Quote]

比如4096多分配16个字节,然后,将返回地址按照16的倍数对齐就可以了。
大概是这样:
char*p=(char*)malloc(4096+16);
char*q=(char*)(((unsigned int)p+16)&(~0XF));
就想叫yoko 2011-05-18
  • 打赏
  • 举报
回复
提高访问速度
lcyw 2011-05-18
  • 打赏
  • 举报
回复
如果 要分配4096 BYTE大小的内存, 以16字节对齐, 怎么做?

luciferisnotsatan 2011-05-18
  • 打赏
  • 举报
回复
内存对齐可以提高访问数度。
详细的,可以看看 深入理解计算机系统
pengzhixi 2011-05-18
  • 打赏
  • 举报
回复
1.某些平台要求对齐有利于提高访问速度,而且如果不对齐可能出现访问错误。
yinghuashihun 2011-05-18
  • 打赏
  • 举报
回复
内存对齐应该是可以设置的



qq120848369 2011-05-18
  • 打赏
  • 举报
回复
对齐很简单的,举个例子:

要求地址是16的倍数,给你一个地址,其二进制表示是:01101110,要求对齐后地址是16倍数,且大于等于当前地

址。

最低4位是1110,这些位只有全部是0,整个地址才能被16整除。

所以,分两种情况:

1,低4位本来就是0000,那么当前地址已经对齐了。
2,低4位不是0000,那么对齐的方法就是让低4位是0000,而且给地址加上10000,这就是比原地址大的第一个是16倍数的地址了。


size_t round_up(size_t bytes, size_t align) { // 将bytes按照align对齐。一般bytes < align
return (((bytes) + align - 1) & ~(align - 1));
}


引用13楼的代码,就可以得到一个通用的对齐函数了,先给低4位加1111,如果是情况1则第5位没有进位,然后与上低4位0000,得到的就是当前地址,本身已经是对齐的。

如果低4位不是0000,那么加上1111肯定会有1个进位到第5位,然后将低4位与0000就可以了,这就是情况2了。
贝塔酷狗 2011-05-18
  • 打赏
  • 举报
回复
#pragma pack( push, 1 ) // 设置按单字节对齐,不加这个下面两个结构体占用空间会不同(虽然表面上看上去相同)

struct SMyStructA
{
bool A;
int C;
char B;
};

struct SMyStructB
{
bool A;
char B;
int C;
};

#pragma pack( pop )


这有个结构体字节对齐的例子~不知道对你有帮助么....
冻结 2011-05-18
  • 打赏
  • 举报
回复

size_t round_up(size_t bytes, size_t align) { // 将bytes按照align对齐。一般bytes < align
return (((bytes) + align - 1) & ~(align - 1));
}
ljt3969636 2011-05-18
  • 打赏
  • 举报
回复
mingcsharp 2011-05-18
  • 打赏
  • 举报
回复
不明白

64,637

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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