malloc提供的低阶位保证是什么?

malloc提供的低阶位保证是什么?,第1张

概述当你调用C的malloc时,是否可以保证前几个低阶位是什么?如果您正在为动态语言编写编译器/解释器,但希望使用bbbbbbbb bbbbbbbb形式的fixnums. . . bbbbbbb1(其中b有点)和bbbbbbbb bbbbbbbb形式的指针. . . bbbbbbb0(反之亦然),有没有办法保证malloc会返回符合这种方案的指针? 我应该只分配比我需要的多两个字节,如果需要,将返回值 当你调用C的malloc时,是否可以保证前几个低阶位是什么?如果您正在为动态语言编写编译器/解释器,但希望使用bbbbbbbb bbbbbbbb形式的fixnums. . . bbbbbbb1(其中b有点)和bbbbbbbb bbbbbbbb形式的指针. . . bbbbbbb0(反之亦然),有没有办法保证malloc会返回符合这种方案的指针?

我应该只分配比我需要的多两个字节,如果需要,将返回值递增1以适应位方案,并将malloc返回的实际指针存储在第二个字节中,以便我知道要释放什么?

我可以假设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这样的东西.您的运行时可能具有类似的功能,如果该运行时不可用,例如使用MSVC时memalign(感谢@R ..)或_aligned_malloc.

总结

以上是内存溢出为你收集整理的malloc提供的低阶位保证是什么?全部内容,希望文章能够帮你解决malloc提供的低阶位保证是什么?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1242020.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-06
下一篇 2022-06-06

发表评论

登录后才能评论

评论列表(0条)

保存