size_t
返回的虚拟内存指针的malloc()
值是否有上限?
我想知道我是否可以安全地设置64位指针的最高位,以指示这不是指针而是字面整数。
答案 0 :(得分:8)
malloc返回void*
而不是整数。转换指向整数的指针并没有给你(虚拟内存)地址,但是必须遵守C语言标准中定义的语义的一些值(0表示空指针,加法和减法与指针算法有关) ,但这就是它。
除此之外,你必须对指针 - cast-to-integers的值做任何假设。事实上,C实现可能很有可能将非空指针转换为整数,并在高位中包含一些内部信息。
答案 1 :(得分:4)
正如@ datenwolf的答案所述,您无法对malloc
如何为您提供内存地址做出任何假设。如果您尝试使用它们来存储元数据,则MSB可能包含您可以覆盖的重要位。我曾经在一个32位系统上工作,该系统返回地址的MSB中设置的地址(不是来自malloc
,而是来自其他系统特定的内存分配函数)。
但是, 保证malloc
将返回适合您系统的地址。例如,在32位系统上,您将获得一个4字节对齐的指针,而在64位上,您将获得一个8字节对齐的指针。这意味着您可以保证低位2或3位将为零。您可以使用memalign
来增加保证位数。它与在最重要的位中存储元数据的效果基本相同。要获取/设置文字,您可以向上/向下移动它到剩余的位。
但是,我不会建议任何一种方法。节省一些心痛,并分配更多的内存来存储标志。除非你有数十亿,否则它真的不值得。
答案 2 :(得分:0)
至于size_t
,它可以包含limits.h定义的值
#ifndef SIZE_MAX
#ifdef _WIN64
#define SIZE_MAX _UI64_MAX
#else
#define SIZE_MAX UINT_MAX
其中_UI64_MAX和UINT_MAX定义如下。
#define UINT_MAX 0xffffffff /* maximum unsigned int value */
#define _UI64_MAX 0xffffffffffffffffui64
就malloc()
而言,在32位Windows上它可以返回0到2 GB用户模式地址空间内的任何(地址)值,在64位Windows上它可以返回任何(地址) )0到8 TB用户模式地址空间内的值。
同样,在32位系统上,从WinNT 4开始,它引入了启动选项/ 3G。有了这个,malloc()
可以返回0到3 GB用户模式地址空间内的任何(地址)值。
有关详细信息,请查看Mark Russinovich的文章here。