指针是否保证>一定的价值?

时间:2012-02-12 14:40:05

标签: c++ memory pointers new-operator ram

在C ++中我做new(甚至是malloc)是否保证返回地址大于某个值?因为......在这个项目中,我发现使用0-1k作为枚举是非常有用的。但如果有可能获得低价值,我不想这样做。我唯一的目标系统是具有OS窗口/ linux和mac的32或64位CPU。

标准是否对指针有所说明? Windows或Linux是否会说出他们的C运行时以及最低内存地址(对于ram)是什么?

-edit-我最终修改了我的new重载以检查地址是否高于> 1k。如果没有,我调用std :: terminate。

5 个答案:

答案 0 :(得分:6)

就标准而言,什么都没有。但实际上,它取决于目标操作系统,例如windows保留了第一个64kb的内存作为无人区域(取决于构建它是只读内存,否则它被标记为PAGE_NOACCESS),而它使用对于内核内存,上限为0x80000000 +,但可以更改,请参阅this& MSDN上的this

在x64上你也可以使用地址的高位(目前只有47位用于地址),但它不是一个好主意,因为后来它会改变你的程序会破坏(设置标准的AMD也建议反对它)。

答案 1 :(得分:4)

没有这样的保证。如果您需要非常具体的内存位置,可以尝试使用placement new但是它有一些问题需要work hard to avoid。为什么不尝试使用带有指针作为其值的整数键的映射?这样您就不必依赖特定的内存地址和范围。

答案 2 :(得分:2)

理论上,没有 - 指针甚至不能保证是>但是,在实践中,被视为无符号整数(不要忘记指针可能有一个高位“1”位),我所知道的系统没有指针值小于1000.但是依赖那就是依赖“未定义的行为”。

答案 3 :(得分:1)

有效内存地址的来源没有标准;编写安全的系统无关代码,你不能依赖某些地址(甚至有轶事支持,你永远不知道什么时候会因新的系统更新而改变)。

答案 4 :(得分:1)

这是非常特定于平台的,所以除非你有充分的理由并且意识到可移植性,可维护性等方面的后果,否则我不鼓励依赖这类信息。

NULL始终保证为0x0。如果我没记错的话,x86将第一个128 MB的地址空间保留为“NULL-equivalent”,这样有效的指针就不能处理这个范围内的值。在x64上有一些additional addresses在实践中你不应该遇到,至少目前是这样。

对于为操作系统保留的地址空间,它显然取决于操作系统。在Linux上,内核用户空间划分可在内核中配置,因此至少3个拆分:1-3 GB,2-2 GB和3-1 GB在32位系统上是常见的。您可以找到更多详细信息on kerneltrap