当你调用C时malloc
,是否可以保证前几个低位是什么?如果你正在为一个动态语言编写一个编译器/解释器但想要有形式的fixnums bbbbbbbb bbbbbbbb . . . bbbbbbb1
(其中b有点)和表单的指针bbbbbbbb bbbbbbbb . . . bbbbbbb0
(反之亦然),有没有办法保证malloc
返回指针适合这样的计划?
我应该只分配比我需要的多两个字节,如果需要,将返回值增加1以适应位方案,并将返回的实际指针存储malloc
在第二个字节中,以便我知道该怎么做free
?
我可以假设malloc
将返回一个零指针作为最后一位吗?我可以假设x86末尾有两个零位,而x64最后会有四个零位吗?
只要指针针对所有可能的类型对齐,C不保证低阶位为零.实际上,最低位的2或3可能为零,但不要指望它.
你可以自己确保,但更好的方法是使用像posix_memalign这样的东西.
如果你想自己做,你需要分配内存并跟踪原始指针.类似的东西(假设您需要16字节对齐,可以是通用的,未经测试):
void* my_aligned_malloc16(size_t sz) { void* p = malloc(sz + 15 + 16); // 15 to ensure alignment, 16 for payload if (!p) return NULL; size_t aligned_addr = ((size_t)p + 15) & (~15); void* aligned_ptr = (void*) aligned_addr; memcpy(aligned_ptr, &p, sizeof(void*)); // save original pointer as payload return (void*)(aligned_addr + 16); // return aligned address past payload } void my_aligned_free16(void* ptr){ void** original_pointer = (void**)( ((size_t)ptr) - 16 ); free(*original_pointer); }
你可以看到这是相当丑陋的,所以更喜欢使用类似的东西posix_memalign
.如果那个运行时不可用,你的运行时可能有类似的功能,例如memalign
(感谢@R ..)或_aligned_malloc在使用MSVC时.