分配空间时,我收到的地址非常不同

时间:2016-06-23 21:40:47

标签: c++ new-operator allocation

我正在使用::operator new( sizeof(T) * count)分配空间。

第一个调用返回地址0x742f30,第二个调用返回0x7f2ef0000d60。我现在对这个巨大的差异感到困惑。

我的问题:这是正常的,返回的地址可能会有多大差异吗?

更新

SLES 11 SP3 VM on XenServer
gcc 4.9.3
10 GB RAM 

更新

因为有些人怀疑输出格式错误。我通过new命令以相同的printf格式显示返回的地址。我通过复制和粘贴将指针值复制到此问题并检查它们两次。它们匹配我的内存分配器的输出。

3 个答案:

答案 0 :(得分:1)

可能的原因是第一个对象是在进程的初始数据段中分配的,但是当你分配了第二个对象时,它就被填满了。传统的内存分配器使用sbrk()来扩展数据段,但是一些现代内存分配器利用mmap()上的/dev/zero来创建新的内存段。这可能会将其虚拟内存分配到地址空间的一个非常远的地方。

答案 1 :(得分:0)

假设对所需内存块的位置没有限制,只要结果是有效的内存指针(即非空),就应该认为是好的。但作为程序员,我会惊讶地看到内存分配函数的响应以不同的方式格式化(在这种情况下具有不同的位数)。

考虑到它是您自己的库,我至少会确保它始终以完全相同的格式输出已分配内存的地址。

答案 2 :(得分:0)

我的回答是Linux必须对内存进行一些奇怪的虚拟化。地址的输出始终采用相同的格式。我认为巴马尔的答案非常接近真正的原因。我可以向SuSe IT询问他们是否有答案。