代码之家  ›  专栏  ›  技术社区  ›  meJustAndrew

为什么两个相继声明的变量在内存中不相邻?

  •  1
  • meJustAndrew  · 技术社区  · 6 年前

    我正在使用一个代码示例来检查两个整数之间的距离,如 the answer of this question 是的。

    int i = 0, j = 0;
    std::cout << &i - &j;
    

    从我对内存表示的理解来看,这两个变量的内存地址应该是相邻的,而差异应该正好是1。

    令我惊讶的是,在VS2017中使用MS编译器运行此代码会打印 运行gcc打印的相同代码 1个 是的。

    为什么会这样,vs有什么问题吗?

    2 回复  |  直到 6 年前
        1
  •  5
  •   Sergey Kalinichenko    6 年前

    C++标准不要求C++编译器以任何特定的方式分配具有自动存储持续时间的变量,包括使它们在内存中连续。事实上,编译器可能会选择不为变量分配任何内存,将其完全优化。

    这就是为什么减去指针只有当它们都指向同一数组中的内存,或者指向超过数组末尾的一个元素时才有意义。在所有其他情况下,包括你的情况下,你会有不明确的行为。

        2
  •  3
  •   Oblivion    6 年前

    指针 arithmetic 您尝试的行为未定义:

    如果指针p指向数组的第i个元素,则 指针指向同一数组的第j个元素, 如果表达式的值符合std::ptrdiff t,那么它的值就是i-j。 两个操作数必须指向同一数组的元素(或一个 否则行为未定义。 如果结果是这样 不适合instd::ptrdiff_t,行为未定义。