c++ - 如果我知道数据在哪里,我能知道什么? 0xfffffff7fffd9d8 与 0x10019c1e0?

标签 c++ memory-management

我想知道指针的数值是否告诉我在调试期间有用的东西。

例如,我的调用堆栈中有以下内容:

std::basic_ostringstream<char, std, char_traits<char>, std::allocator, <char>void>::str(
    0xffffffff7fffd9d8, 
    0x10019c1e0, 
    0x100446710, 
    0x0, 
    0xffffffff7fffd9d8, 
    0xffffffff7b331688), 
at 0xffffffff7b1b28ec

似乎有 0xfff0x100 形式的指针。这种差异有意义吗?

最佳答案

在 64 位平台上,理论上您可以寻址 264 或大约 16 艾字节。由于大多数应用程序不需要这么大的地址空间,硬件供应商定义更小的虚拟地址空间以降低地址转换的成本。因此,在 AMD 和 Intel 芯片上,只有地址的最低 48 位是有效的,并且第 48 位到第 63 位必须是第 47 位的拷贝。这些被称为规范形式地址,它们跨越以下范围:

  • 000000000000000000007FFFFFFFFFFFF
  • FFFF800000000000FFFFFFFFFFFFFFFF

前者称为规范下半部分 地址,后者称为规范上半部分。这是内核的决定,但通常上半部地址指的是堆栈和静态程序数据区,而下半部地址指的是堆内存。

来源:Wikipedia

关于c++ - 如果我知道数据在哪里,我能知道什么? 0xfffffff7fffd9d8 与 0x10019c1e0?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33701451/

相关文章:

ios - 释放单例

C++:是否可以有一个模板类来表示对资源的条件引用?

c++ - gcc 6.1 std::result_of 编译错误

c++ - 类相互依赖问题

c++ - 是否可以使用 Visual Studio 2013 C++ 强制执行标准行为?

.net - 静态类/成员在哪里分配?

c++ - 如何在现代 C++ 中有效地为指向虚拟基类的指针 vector 分配空间

c - valgrind 错误 : invalid read

c++ - 无法比较两个范围

c++ - 访问共享内存时读取访问冲突