真搞不懂vc6.0是怎么优化的。。。

boodweb 2003-04-07 09:12:28
看注释就知道了
谁有vc7编译一下看看有没有类似问题
我用dev c++编译就没这个问题

#include <iostream>

using namespace std;

bool bout=0;

class AssistClass{
public:
int i;
int& operator [](int j){
if(bout) cout<<"AssistClass:"<<j<<"="<<p[i+j]<<endl;
return p[i+j];
};
private:
int p[100];
};

class TestClass{
public:
AssistClass &operator [](int i){
m_Assist.i=i;
if(bout) cout<<"TestClass:"<<i<<",";
return m_Assist;
}
private:
AssistClass m_Assist;
};
int main()
{
TestClass x;
int i,j,k,r;
for(i=0;i<3;i++)
for(j=0;j<3;j++)
x[i][j]=i+j;
i=0;j=1;k=2;
bout=1;
//x[i][j]=i+j=1
//x[j][k]=j+k=3
r=x[i][j]*x[j][k];
//What will be x[i][j] now?
//We hope it to be 3,
//but the release version of VC6.0 shows us 6
cout<<r<<endl;
bout=0;
return 0;
}
...全文
7 点赞 收藏 6
写回复
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
boodweb 2003-04-09
发信人: Carrot (大萝卜1号), 信区: Program
标 题: Re: 真搞不懂vc6.0是怎么优化的。。。
发信站: 南京大学小百合站 (Tue Apr 8 16:09:12 2003)


1 3 2 4
1 x[i] assist.i = 0
2 x[j] assist.i = 1
3 assist[j] = assist.i + j = 1 + 1 = 2
4 assist[k] = assist.i + k = 1 + 2 = 3

2 * 3 = 6

其中关键之处就在于x[i] 和 x[j] 返回同一对象assist的引用
并且在计算过程中assist的内部状态(i)发生了改变

不过按Carrot的说法,程序的输出应该是这样的:
TestClass:0,TestClass:1,AssistClass:1=2
AssistClass:2=3
6

但是vc6的实际输出却是:
TestClass:0,AssistClass:1=1
TestClass:1,AssistClass:2=3
6
这又如何解释呢?
回复
robertnet 2003-04-07
如何优化,热切关注。
回复
qiuafa 2003-04-07
捧场
回复
zhouzhaohan 2003-04-07
你确定是优化的原因吗?你把VC的优化关掉再试试看。用/Od选项关掉优化。
回复
Jinglihui 2003-04-07
我用borland最新的编译器结果和你用dev-c++的结果相同
回复
boodweb 2003-04-07
下面说的可能很有道理的说
不过如果返回临时对象的话效率就低了
有什么更好的实现办法吗

发信人: Carrot(大萝卜1号), 信区: Program. 本篇人气: 15
标 题: Re: 真搞不懂vc6.0是怎么优化的。。。
发信站: 南京大学小百合站 (Mon Apr 7 10:40:51 2003)

表达式计算顺序的问题
c/c++没有规定一个表达式中在符合运算规则的情况下各个字表达式的计算顺序
在加上你的程序中存在副作用(使用了全局唯一的一个assistclass)
因为优化改变了表达式的计算顺序(和你想象的从左到右不同)
所以得到了不同的结果

r = x[i][j] * x[j][k]
~~ ~~ ~~ ~~
2 3 1 4
回复
发动态
发帖子
C语言
创建于2007-09-28

6.3w+

社区成员

C语言相关问题讨论
申请成为版主
社区公告
暂无公告