为什么gcc中debug和release的结果不一样?

时间:2022-01-28 11:29:20
我编了一个电力系统的潮流程序,用的是code block 10.5。最近一个问题纠结了我很久,最后才发现原来是code block中debug和release的结果不一样。难道这是编译器的bug还是我在编程的时候有些地方没有注意到?

同样的程序在vs2005中无论是在debug还是在release的情况下都是一样的。
顺便说一下,vs2005中算法的效率好像不如code block中的gcc高啊。

论坛不能上传附件,我把程序放在这里了
http://download.csdn.net/source/3193805

不好意思上传这个附件的时候没注意有资源分,现在想把资源分改为0又改不了。我真的是为了问问题,不是为了赚分的,希望大家谅解。

22 个解决方案

#1


调试的条件引起的?

#2


gcc是最原始的 当然很快啊  应该是条件引起的 没怎么用过release

#3


我也经历过这种不同,比如未初始化的存储,VS的DEBUG就是尽量让你的问题暴露,他不做任何处理;而release可能会帮你默默初始化为0.
GCC能让你程序的缺陷在DEBUG阶段暴露出来,这是好事,具体问题具体分析,不要纠结于GCC本身了。

#4


变量的初始化有没?

#5


单步调试才能找到真正的问题所在。
你给的附件Debug版无法链接。

注意:变量未初始化 是导致Debug/Release结果不一致的 常 见 原 因!

#6


vs2005中算法的效率好像不如code block中的gcc高啊 
这个指什么算法效率?stl的?

VS带的那个stl库的确不如gcc的

另外,gcc和vs是编同一平台上的程序,还是gcc编linux版本,vs编windows的?

#7


我打错了,在我的电脑上是gcc的效率不如vs2005.
算一个300节点的数据,vs用时0.8秒,gcc用时1.6秒。

#8


引用 7 楼 facat 的回复:
我打错了,在我的电脑上是gcc的效率不如vs2005.
算一个300节点的数据,vs用时0.8秒,gcc用时1.6秒。

在Windows平台,当然VC效率高了。

#9


如果你是想计算时间, 肯定是不一样的, debug要引入很多的调试库, 所以走得流程会很冗余, 

#10


我找到出错的地方了,不是变量为初始化,而是这句
for(UINT i=this->m_Dim-1; i>=0 && i!= (0u-1); i--)

改成这样就行了
for(int i=this->m_Dim-1; i>=0; i--)

我当时是这样想的,我的循环退出的条件是i小于0,但UINT不可能小于0,所以我就让i等于0-1时退出循环(如果是有符号类型的话0-1就是-1,但无符号类型应该是一个最大的整数。)。可能还不同编译器对i!= (0u-1)的定义不一样吧。

如果还是上面那个循环,但我希望使用UINT类型的i应该怎么写退出条件呢?

btw,我把所有编译warning开关打开了才发现这个错误的。

#11


引用 10 楼 facat 的回复:
我找到出错的地方了,不是变量为初始化,而是这句
for(UINT i=this->m_Dim-1; i>=0 && i!= (0u-1); i--)

改成这样就行了
for(int i=this->m_Dim-1; i>=0; i--)

我当时是这样想的,我的循环退出的条件是i小于0,但UINT不可能小于0,所以我就让i等于0-1时退出循环(如果是有符号类型的话0……

貌似又不是这个地方。

#12


一起学习下 为什么gcc中debug和release的结果不一样?

#13


该回复于2011-04-15 16:39:59被版主删除

#14


出了变量为初始化外还有其他什么原因会导致debug和release不同吗?

#15


该回复于2011-04-15 17:10:04被版主删除

#16


引用 14 楼 facat 的回复:
出了变量为初始化外还有其他什么原因会导致debug和release不同吗?

全局作用域的变量(基础类型及其指针类型)需要用
volatile 修饰,特别是多线程环境下。
Debug模式下编译器不对变量优化,也就是直接地址读取,而
Release下编译器会对这些变量优化,使用CPU寄存器缓存,从
寄存器读,则在多线程环境下这样的优化难免导致同步问题。
应该用 volatile 修饰,告诉编译器对于volatile 修饰的
变量不要做任何优化,直接地址读写。

#17


先学习一下。

会不会是DEBUG和Release两个版本给的编译等设置不同啊。他们的设置好像不是共用的。

#18


优化,,,
看看release与debug的区别

#19


我用的是模版类 所以我试了一下其他几种类型 当用float和long double的时候都可以得到正确的结果,就是用double的时候不行
不过用float的时候debug的迭代次数比long double要多。
怎么会这样啊!!!!!!!!!!!!!!!!!!!!!

#20


更正一下~~~~~~~~~~~~

我用的是模版类 所以我试了一下其他几种类型 当用float和long double的时候都可以得到正确的结果,就是用double的时候不行
不过用float的时候debug的迭代次数比release要多。
怎么会这样啊!!!!!!!!!!!!!!!!!!!!!

#21


这样我要在vs中写程序了,但以后的程序移植很有问题啊!!!

#22


引用 8 楼 loaden 的回复:
引用 7 楼 facat 的回复:

我打错了,在我的电脑上是gcc的效率不如vs2005.
算一个300节点的数据,vs用时0.8秒,gcc用时1.6秒。

在Windows平台,当然VC效率高了。


得看编译开关是啥
另外如果是递归展开的什么的,vc要比gcc慢5倍左右……

#1


调试的条件引起的?

#2


gcc是最原始的 当然很快啊  应该是条件引起的 没怎么用过release

#3


我也经历过这种不同,比如未初始化的存储,VS的DEBUG就是尽量让你的问题暴露,他不做任何处理;而release可能会帮你默默初始化为0.
GCC能让你程序的缺陷在DEBUG阶段暴露出来,这是好事,具体问题具体分析,不要纠结于GCC本身了。

#4


变量的初始化有没?

#5


单步调试才能找到真正的问题所在。
你给的附件Debug版无法链接。

注意:变量未初始化 是导致Debug/Release结果不一致的 常 见 原 因!

#6


vs2005中算法的效率好像不如code block中的gcc高啊 
这个指什么算法效率?stl的?

VS带的那个stl库的确不如gcc的

另外,gcc和vs是编同一平台上的程序,还是gcc编linux版本,vs编windows的?

#7


我打错了,在我的电脑上是gcc的效率不如vs2005.
算一个300节点的数据,vs用时0.8秒,gcc用时1.6秒。

#8


引用 7 楼 facat 的回复:
我打错了,在我的电脑上是gcc的效率不如vs2005.
算一个300节点的数据,vs用时0.8秒,gcc用时1.6秒。

在Windows平台,当然VC效率高了。

#9


如果你是想计算时间, 肯定是不一样的, debug要引入很多的调试库, 所以走得流程会很冗余, 

#10


我找到出错的地方了,不是变量为初始化,而是这句
for(UINT i=this->m_Dim-1; i>=0 && i!= (0u-1); i--)

改成这样就行了
for(int i=this->m_Dim-1; i>=0; i--)

我当时是这样想的,我的循环退出的条件是i小于0,但UINT不可能小于0,所以我就让i等于0-1时退出循环(如果是有符号类型的话0-1就是-1,但无符号类型应该是一个最大的整数。)。可能还不同编译器对i!= (0u-1)的定义不一样吧。

如果还是上面那个循环,但我希望使用UINT类型的i应该怎么写退出条件呢?

btw,我把所有编译warning开关打开了才发现这个错误的。

#11


引用 10 楼 facat 的回复:
我找到出错的地方了,不是变量为初始化,而是这句
for(UINT i=this->m_Dim-1; i>=0 && i!= (0u-1); i--)

改成这样就行了
for(int i=this->m_Dim-1; i>=0; i--)

我当时是这样想的,我的循环退出的条件是i小于0,但UINT不可能小于0,所以我就让i等于0-1时退出循环(如果是有符号类型的话0……

貌似又不是这个地方。

#12


一起学习下 为什么gcc中debug和release的结果不一样?

#13


该回复于2011-04-15 16:39:59被版主删除

#14


出了变量为初始化外还有其他什么原因会导致debug和release不同吗?

#15


该回复于2011-04-15 17:10:04被版主删除

#16


引用 14 楼 facat 的回复:
出了变量为初始化外还有其他什么原因会导致debug和release不同吗?

全局作用域的变量(基础类型及其指针类型)需要用
volatile 修饰,特别是多线程环境下。
Debug模式下编译器不对变量优化,也就是直接地址读取,而
Release下编译器会对这些变量优化,使用CPU寄存器缓存,从
寄存器读,则在多线程环境下这样的优化难免导致同步问题。
应该用 volatile 修饰,告诉编译器对于volatile 修饰的
变量不要做任何优化,直接地址读写。

#17


先学习一下。

会不会是DEBUG和Release两个版本给的编译等设置不同啊。他们的设置好像不是共用的。

#18


优化,,,
看看release与debug的区别

#19


我用的是模版类 所以我试了一下其他几种类型 当用float和long double的时候都可以得到正确的结果,就是用double的时候不行
不过用float的时候debug的迭代次数比long double要多。
怎么会这样啊!!!!!!!!!!!!!!!!!!!!!

#20


更正一下~~~~~~~~~~~~

我用的是模版类 所以我试了一下其他几种类型 当用float和long double的时候都可以得到正确的结果,就是用double的时候不行
不过用float的时候debug的迭代次数比release要多。
怎么会这样啊!!!!!!!!!!!!!!!!!!!!!

#21


这样我要在vs中写程序了,但以后的程序移植很有问题啊!!!

#22


引用 8 楼 loaden 的回复:
引用 7 楼 facat 的回复:

我打错了,在我的电脑上是gcc的效率不如vs2005.
算一个300节点的数据,vs用时0.8秒,gcc用时1.6秒。

在Windows平台,当然VC效率高了。


得看编译开关是啥
另外如果是递归展开的什么的,vc要比gcc慢5倍左右……