请教各位,VC Release版编译优化错误?

guoj1997 2003-08-19 10:18:32
#include <stdio.h>
void main()
{
int i = 1;
int j = 2;
long p1 = (long)(&i);
long p2 = (long)(&j);
printf("(p1-p2)>0: p1=0x%08X, p2=0x%08X, p1 %s p2\n",
p1, p2, (p1-p2)>0 ? ">" : "<");
printf(" p1 > p2: p1=0x%08X, p2=0x%08X, p1 %s p2\n",
p1, p2, p1>p2 ? ">" : "<");
}

请运行以上代码的Release版。
在我的机器上第个printf()会打印出错误结果:p1 < p2, 应该是p1 > p2
cl.exe 版本号:12.0.8168.0
...全文
28 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
gufengduyu 2003-08-19
  • 打赏
  • 举报
回复
谭浩强的C程序设计中213页:
5。两个指针变量比较
若两个指针指向同一个数组的元素,则可以进行比较。指向前面的元素的指针变量小于指向后面元素的指针变量。注意,如果两个指针不指向同一数组则比较无意义。

也就是说,你这么编程无意义!!!
guoj1997 2003-08-19
  • 打赏
  • 举报
回复
多谢各位参加讨论,关键这是一个编译优化错误,不知有没有解决类似问题的VC补丁?

据我所知道的C/C++编译器,在堆栈中分配变量的地址都是在堆栈中顺序递减的,
对于局部变量,编译器会尽量使用寄存器来替代,但如果有取地址操作,就会为其在堆栈中分配地址。

我看了生成的Release版的汇编代码,比较运算在编译期间就计算出来了,
把 p1>p2 ? ">" : "<" 作为一个常量"<"对待了,但是计算错误。
mfc168 2003-08-19
  • 打赏
  • 举报
回复
project->settings->c/c++ ->optimizations 这里设置不同的编译方式,系统就会采用不同的内存分配机制,你可以试一下,采用不同的方式,会出现不同的结果
mfc168 2003-08-19
  • 打赏
  • 举报
回复
即使是一样的,那地址p1 < p2,这个也是合理的,这个和Release版本问题没有关系,是属于系统的内存分配机制,属于堆栈操作,后进先出的方式,你可以自己做一个测试:
char *p;
int a;
int b;
char c;
long d;

long m=(long)(&p);
long n=(long)(&a);
long o=(long)(&b);
long p=(long)(&c);
long q=(long)(&d);

依次的大小顺序为:m>n>o>p>q (与你所定义变量顺序有关) 程序结束的时候,依次弹栈顺序和你分配顺序相反(后进先出的方式)



luogucai 2003-08-19
  • 打赏
  • 举报
回复
根编译器相关
gufengduyu 2003-08-19
  • 打赏
  • 举报
回复
to mfc168(闶阆) :
不同时候运行,分配地址是不一样的

我在本机的不同时刻和其他机器上试了,对同一版本的编译器,地址是一样的

niani 2003-08-19
  • 打赏
  • 举报
回复
long p1 = (long)(&i);
long p2 = (long)(&j);

你这个P1,P2取的是i,j的地址
mfc168 2003-08-19
  • 打赏
  • 举报
回复
按照你所写的程序,应该是取得你所分配变量的内存地址,然后进行地址加减运算判断……

输出的结果不是错误的,因为程序运行的时候,对你所定义变量的分配是动态的,不同时候运行,分配地址是不一样的,就是这样
soldier1998 2003-08-19
  • 打赏
  • 举报
回复
不好意思,,知道了!
gufengduyu 2003-08-19
  • 打赏
  • 举报
回复
我这边也是这样
我认为这是受编译器内存分配的影响
Release版时由于对代码优化,造成p1,p2的内存地址发生改变
soldier1998 2003-08-19
  • 打赏
  • 举报
回复
long p1 = (long)(&i);
long p2 = (long)(&j);

是什么意思!
long p1 = (long)(i);
long p2 = (long)(j);
不行么???
sunheroshang 2003-08-19
  • 打赏
  • 举报
回复
学习

16,467

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧