【问题标题】:Is it a must that an integer must be stored in contiguous memory addresses?整数必须存储在连续的内存地址中吗?
【发布时间】:2017-03-05 12:24:55
【问题描述】:

首先,我说的是 32 位架构。我的教授给我们举了一个例子,说明如何存储 C/C++ 32 位整数的地址,地址为0A0B0C0D,整数的第一个字节存储在0x0A,第二个字节存储在0x0B ,第三个在0x0C,第四个在0x0D。但是,我在 C++ 中尝试了以下代码:

#include <iostream>
int main(){
  int a = 5;
  std::cout << &a;
}

我得到了0x7fffba2e6c3c。然而,这看起来不像教授给我们的例子那样字节是连续的。我的问题是,为什么编译器不将整数的 4 个字节存储在连续的内存地址中,而不是将整数的每个字节存储在不同的地址中?

【问题讨论】:

  • 0A0B0C0D完整地址。第一个字节不存储在0A。它存储在0A0B0C0D
  • @tkausl 第一个字节更有可能在 0x0A..
  • 要么你的教授选择了一个特别糟糕的例子,要么他们的意思是0A0B0C0D 是整数的,存储在0A

标签: c++ memory memory-address


【解决方案1】:

地址为 0A0B0C0D,整数的第一个字节存储在 0x0A

这里似乎有些混乱。

如果一个整数的第一个字节存放在0x0A,那么整个整数的地址就是0x0A。 0A0B0C0D 似乎是作为该整数一部分的字节地址的某种串联。

或者反过来说,如果整数的地址是0x0A0B0C0D,那么第一个字节的地址也是0x0A0B0C0D,第二个字节的地址就是0x0A0B0C0E,以此类推。

我得到了 0x7fffba2e6c3c。但是,这看起来并不像字节是连续的

您已经打印了整数的地址。您无法从地址判断该地址处的对象是否连续。例如,如果您在教授的示例中得到了 0x0A,您将如何确定后续字节是还是不是 0x0B?

你不能从地址得出这样的结论,但你只需要假设连续性。

整数必须存储在连续的内存地址中吗?

是的。所有对象在内存中都是连续的。 (请注意,一个对象可以包含单独对象的地址,这些地址不一定相对于持有指针的对象连续存储。因此,例如,链表对象不会连续存储列表的元素,而是每个节点列表本身是连续的)。

【讨论】:

    【解决方案2】:

    整数必须存储在连续的内存地址中吗?

    是的,因为 C++ 标准 §1.8/5 规定:

    普通可复制或标准布局类型 (...) 的对象应 占用连续字节的存储空间。

    至于你的例子,

    但是,这看起来不像教授给我们的例子那样字节是连续的。

    您误解了输出。您看到的只是int 开始的单个地址。

    【讨论】:

      【解决方案3】:

      所有内置类型,包括整数,都占用内存中的连续字节。

      当您将&amp;a 打印到cout 时,您将获得整数初始字节的地址。其他三个字节存储在它后面。在您的情况下,接下来的三个字节将位于 0x7fffba2e6c3d0x7fffba2e6c3e0x7fffba2e6c3f

      【讨论】:

        【解决方案4】:

        这并不是真正的强制性,但是,如果您以其他方式执行此操作,则计算机系统/应用程序的内存 i/o 性能将不会达到最佳和高效。

        将应用程序数据存储在内存的连续区域中,可以优化内存级别的访问。为什么?因为内存本身被设计为在内存访问操作指向连续内存地址时表现最佳。

        【讨论】:

          【解决方案5】:

          你的教授犯了一个错误,写得太近了:)
          0A0B0C0D 是整数的四个字节的地址。连续内存意味着整个整数的地址将是0A。就是这样。
          NOT 将它们四个连接起来,这根本没有意义。

          相反,要获取连续内存中第二个字节的地址,只需将第一个字节的地址加 1:0A+1=0B

          你的代码打印出来的是你的变量a的地址;在现实生活中,由于虚拟内存、分页、大量加载的东西等等,地址往往很丑陋。您可以将 reinterpret_cast 发送到 char* 并遍历整数的字节:

          char* b = reinterpret_cast<char*>(&a); // now *b is the first byte
          for(int i=0;i<sizeof(int);i++)
              std::cout<< static_cast<int>(*b++) <<' ';
          

          它应该输出三个零和一个 5(以平台相关的顺序)

          【讨论】:

            猜你喜欢
            • 2012-10-25
            • 1970-01-01
            • 2022-11-14
            • 1970-01-01
            • 1970-01-01
            • 2019-06-12
            • 1970-01-01
            • 2019-06-20
            • 2014-08-12
            相关资源
            最近更新 更多