返回信息流free_mem_ptr = (free_mem_ptr + 3) & ~3; /* Align */
这句里的3有什么特殊含义,为什么是3?
static void *malloc(int size)
{
void *p;
if (size <0) error("Malloc error");
if (free_mem_ptr == 0) error("Memory error");
free_mem_ptr = (free_mem_ptr + 3) & ~3; /* Align */
p = (void *)free_mem_ptr;
free_mem_ptr += size;
if (free_mem_ptr >= free_mem_end_ptr)
error("Out of memory");
return p;
}
这是一条镜像帖。来源:北邮人论坛 / cpp / #12274同步于 2008/9/10
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖
指点一下这段代码,谢谢
ATV
2008/9/10镜像同步9 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
因为3的二进制就是11....
【 在 ATV (ATV) 的大作中提到: 】
: free_mem_ptr = (free_mem_ptr + 3) & ~3; /* Align */
: 这句里的3有什么特殊含义,为什么是3?
: static void *malloc(int size)
: ...................
【 在 janeyre 的大作中提到: 】
: 详细点?
其实不就是总是保持最后两位是00,如果原来的指针的最后两位刚好是00就不用动了,如果不是00的话,那就转化为下一个是00的地址。然后这个指针就总是4的倍数
【 在 Monono 的大作中提到: 】
: 其实不就是总是保持最后两位是00,如果原来的指针的最后两位刚好是00就不用动了,如果不是00的话,那就转化为下一个是00的地址。
这样做是不是和我们平时经常提到的对齐是一样的?也就是总是保持地址是4的倍数
我觉得就是这样的
【 在 Monono (sss) 的大作中提到: 】
: 这样做是不是和我们平时经常提到的对齐是一样的?也就是总是保持地址是4的倍数
不过这个malloc是不是也太简单了...
http://blogimg.chinaunix.net/blog/upfile2/080101160701.pdf
http://forum.byr.edu.cn/wForum/elite.php?file=%2Fgroups%2Fsci.faq%2FSoftDesign%2FProgrammingLangue%2FC%2FM.1103766433.V0
赞啊!
今天看到 Apache 里的一段代码突然又想到这个帖子了
/* APR_ALIGN() is only to be used to align on a power of 2 boundary */
#define APR_ALIGN(size, boundary) \
(((size) + ((boundary) - 1)) & ~((boundary) - 1))
【 在 Monono (sss) 的大作中提到: 】
: 其实不就是总是保持最后两位是00,如果原来的指针的最后两位刚好是00就不用动了,如果不是00的话,那就转化为下一个是00的地址。然后这个指针就总是4的倍数