C++ 在有优化和无优化的模式下会产生不同的结果

C++ 在有优化和无优化的模式下会产生不同的结果,c++,optimization,compiler-optimization,C++,Optimization,Compiler Optimization,某些编译器上的代码在有优化和无优化的模式下给出不同的结果。这意味着代码无效。什么是不正确的 #include <stdio.h> #include <stddef.h> int a = 3; int b = 5; int main (void) { size_t delta; int *ptr; delta = &b - &a; ptr = &a + delta; printf ("%d\n", *ptr); ret

某些编译器上的代码在有优化和无优化的模式下给出不同的结果。这意味着代码无效。什么是不正确的

#include <stdio.h>
#include <stddef.h>

int a = 3;
int b = 5;

int
main (void)
{
  size_t delta;
  int *ptr;

  delta = &b - &a;
  ptr = &a + delta;

  printf ("%d\n", *ptr);
  return 0;
}
#包括
#包括
INTA=3;
int b=5;
int
主(空)
{
三角洲大小;
int*ptr;
增量=&b-&a;
ptr=&a+delta;
printf(“%d\n”,*ptr);
返回0;
}

计算表达式
&b-&a
是未定义的行为,因为
b
a
不是同一对象的子对象。

您只能减去指向同一数组元素的指针,或从数组末尾减去一个指针。根据C++11标准5.7.6:

除非两个指针都指向同一数组对象的元素,或者一个指针超过数组对象的最后一个元素,否则行为是未定义的


C标准操作差分指针(可能还有所有指针都是算术的)仅为指针定义,它们查看相同的对象。“对象”一词的意思是,在家庭层面上称为“变量”而不是C++对象。因此,就标准
未定义的
而言,
delta
的总值


在两个具有强大上下文分析器和硬件功能的编译器上,完成了一些复杂的测试,测试结果正常。测试的形式略有不同,但为了简单起见,请离开。

因为您的代码更接近C代码,所以我将引用C标准。根据它

7在这些运算符中,指向以下对象的指针: 数组中的元素的行为与指向第一个元素的指针的行为不同 长度为1的数组的元素,其对象类型为 元素类型

9减去两个指针时,两个指针都应指向 相同的数组对象,或超过数组最后一个元素的一个 对象结果是两个的下标不同 数组元素


在您的示例中,两个指针不指向同一数组的元素。因此,行为是未定义的。

在进行优化和不进行优化的情况下,您会得到什么样的结果?我试图了解您的想法。它不起作用了。@cmbasnett我不记得了。现在我用手机写信,我说是明天,另一个SO帖子打进来了…这应该会打印出5张,但是&a+&b-&a!=&b、 如果整数之间有空格,则差值向下舍入。