我想知道在调试过程中指针的数值是否可以告诉我一些用法。
例如,我的调用堆栈中包含以下内容:
std::basic_ostringstream<char, std, char_traits<char>, std::allocator, <char>void>::str(
0xffffffff7fffd9d8,
0x10019c1e0,
0x100446710,
0x0,
0xffffffff7fffd9d8,
0xffffffff7b331688),
at 0xffffffff7b1b28ec
似乎有形式为0xfff
和的指针0x100
。这种区别有什么意义吗?
在理论上,在64位平台上,您可以寻址2 64或大约16 EB。由于大多数应用程序不需要这么大的地址空间,因此硬件供应商定义了较小的虚拟地址空间,以降低地址转换的成本。因此,在AMD和Intel芯片上,只有地址的最低有效48位是有效的,并且第48位至第63位必须是第47位的副本。这些被称为规范形式地址,并且它们跨越以下范围:
0000000000000000
- 00007FFFFFFFFFFF
FFFF800000000000
- FFFFFFFFFFFFFFFF
前者被称为规范下半部地址,后者规范上半部分。这是内核的决定,但通常上半部分的地址指的是堆栈和静态程序数据区域,而下半部分的地址指的是堆内存。
资料来源:维基百科
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句