我想知道指针的数值是否告诉我在调试期间有用的东西。
例如,我的调用堆栈中有以下内容:
std::basic_ostringstream<char, std, char_traits<char>, std::allocator, <char>void>::str(
0xffffffff7fffd9d8,
0x10019c1e0,
0x100446710,
0x0,
0xffffffff7fffd9d8,
0xffffffff7b331688),
at 0xffffffff7b1b28ec
似乎有 0xfff
和 0x100
形式的指针。这种差异有意义吗?
最佳答案
在 64 位平台上,理论上您可以寻址 264 或大约 16 艾字节。由于大多数应用程序不需要这么大的地址空间,硬件供应商定义更小的虚拟地址空间以降低地址转换的成本。因此,在 AMD 和 Intel 芯片上,只有地址的最低 48 位是有效的,并且第 48 位到第 63 位必须是第 47 位的拷贝。这些被称为规范形式地址,它们跨越以下范围:
0000000000000000
—00007FFFFFFFFFFFF
FFFF800000000000
—FFFFFFFFFFFFFFFF
前者称为规范下半部分 地址,后者称为规范上半部分。这是内核的决定,但通常上半部地址指的是堆栈和静态程序数据区,而下半部地址指的是堆内存。
来源:Wikipedia
关于c++ - 如果我知道数据在哪里,我能知道什么? 0xfffffff7fffd9d8 与 0x10019c1e0?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33701451/