同样的程序在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本身了。
GCC能让你程序的缺陷在DEBUG阶段暴露出来,这是好事,具体问题具体分析,不要纠结于GCC本身了。
#4
变量的初始化有没?
#5
单步调试才能找到真正的问题所在。
你给的附件Debug版无法链接。
注意:变量未初始化 是导致Debug/Release结果不一致的 常 见 原 因!
你给的附件Debug版无法链接。
注意:变量未初始化 是导致Debug/Release结果不一致的 常 见 原 因!
#6
vs2005中算法的效率好像不如code block中的gcc高啊
这个指什么算法效率?stl的?
VS带的那个stl库的确不如gcc的
另外,gcc和vs是编同一平台上的程序,还是gcc编linux版本,vs编windows的?
这个指什么算法效率?stl的?
VS带的那个stl库的确不如gcc的
另外,gcc和vs是编同一平台上的程序,还是gcc编linux版本,vs编windows的?
#7
我打错了,在我的电脑上是gcc的效率不如vs2005.
算一个300节点的数据,vs用时0.8秒,gcc用时1.6秒。
算一个300节点的数据,vs用时0.8秒,gcc用时1.6秒。
#8
在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开关打开了才发现这个错误的。
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
貌似又不是这个地方。
#12
一起学习下
#13
#14
出了变量为初始化外还有其他什么原因会导致debug和release不同吗?
#15
#16
全局作用域的变量(基础类型及其指针类型)需要用
volatile 修饰,特别是多线程环境下。
Debug模式下编译器不对变量优化,也就是直接地址读取,而
Release下编译器会对这些变量优化,使用CPU寄存器缓存,从
寄存器读,则在多线程环境下这样的优化难免导致同步问题。
应该用 volatile 修饰,告诉编译器对于volatile 修饰的
变量不要做任何优化,直接地址读写。
#17
先学习一下。
会不会是DEBUG和Release两个版本给的编译等设置不同啊。他们的设置好像不是共用的。
会不会是DEBUG和Release两个版本给的编译等设置不同啊。他们的设置好像不是共用的。
#18
优化,,,
看看release与debug的区别
看看release与debug的区别
#19
我用的是模版类 所以我试了一下其他几种类型 当用float和long double的时候都可以得到正确的结果,就是用double的时候不行
不过用float的时候debug的迭代次数比long double要多。
怎么会这样啊!!!!!!!!!!!!!!!!!!!!!
不过用float的时候debug的迭代次数比long double要多。
怎么会这样啊!!!!!!!!!!!!!!!!!!!!!
#20
更正一下~~~~~~~~~~~~
我用的是模版类 所以我试了一下其他几种类型 当用float和long double的时候都可以得到正确的结果,就是用double的时候不行
不过用float的时候debug的迭代次数比release要多。
怎么会这样啊!!!!!!!!!!!!!!!!!!!!!
我用的是模版类 所以我试了一下其他几种类型 当用float和long double的时候都可以得到正确的结果,就是用double的时候不行
不过用float的时候debug的迭代次数比release要多。
怎么会这样啊!!!!!!!!!!!!!!!!!!!!!
#21
这样我要在vs中写程序了,但以后的程序移植很有问题啊!!!
#22
得看编译开关是啥
另外如果是递归展开的什么的,vc要比gcc慢5倍左右……
#1
调试的条件引起的?
#2
gcc是最原始的 当然很快啊 应该是条件引起的 没怎么用过release
#3
我也经历过这种不同,比如未初始化的存储,VS的DEBUG就是尽量让你的问题暴露,他不做任何处理;而release可能会帮你默默初始化为0.
GCC能让你程序的缺陷在DEBUG阶段暴露出来,这是好事,具体问题具体分析,不要纠结于GCC本身了。
GCC能让你程序的缺陷在DEBUG阶段暴露出来,这是好事,具体问题具体分析,不要纠结于GCC本身了。
#4
变量的初始化有没?
#5
单步调试才能找到真正的问题所在。
你给的附件Debug版无法链接。
注意:变量未初始化 是导致Debug/Release结果不一致的 常 见 原 因!
你给的附件Debug版无法链接。
注意:变量未初始化 是导致Debug/Release结果不一致的 常 见 原 因!
#6
vs2005中算法的效率好像不如code block中的gcc高啊
这个指什么算法效率?stl的?
VS带的那个stl库的确不如gcc的
另外,gcc和vs是编同一平台上的程序,还是gcc编linux版本,vs编windows的?
这个指什么算法效率?stl的?
VS带的那个stl库的确不如gcc的
另外,gcc和vs是编同一平台上的程序,还是gcc编linux版本,vs编windows的?
#7
我打错了,在我的电脑上是gcc的效率不如vs2005.
算一个300节点的数据,vs用时0.8秒,gcc用时1.6秒。
算一个300节点的数据,vs用时0.8秒,gcc用时1.6秒。
#8
在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开关打开了才发现这个错误的。
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
貌似又不是这个地方。
#12
一起学习下
#13
#14
出了变量为初始化外还有其他什么原因会导致debug和release不同吗?
#15
#16
全局作用域的变量(基础类型及其指针类型)需要用
volatile 修饰,特别是多线程环境下。
Debug模式下编译器不对变量优化,也就是直接地址读取,而
Release下编译器会对这些变量优化,使用CPU寄存器缓存,从
寄存器读,则在多线程环境下这样的优化难免导致同步问题。
应该用 volatile 修饰,告诉编译器对于volatile 修饰的
变量不要做任何优化,直接地址读写。
#17
先学习一下。
会不会是DEBUG和Release两个版本给的编译等设置不同啊。他们的设置好像不是共用的。
会不会是DEBUG和Release两个版本给的编译等设置不同啊。他们的设置好像不是共用的。
#18
优化,,,
看看release与debug的区别
看看release与debug的区别
#19
我用的是模版类 所以我试了一下其他几种类型 当用float和long double的时候都可以得到正确的结果,就是用double的时候不行
不过用float的时候debug的迭代次数比long double要多。
怎么会这样啊!!!!!!!!!!!!!!!!!!!!!
不过用float的时候debug的迭代次数比long double要多。
怎么会这样啊!!!!!!!!!!!!!!!!!!!!!
#20
更正一下~~~~~~~~~~~~
我用的是模版类 所以我试了一下其他几种类型 当用float和long double的时候都可以得到正确的结果,就是用double的时候不行
不过用float的时候debug的迭代次数比release要多。
怎么会这样啊!!!!!!!!!!!!!!!!!!!!!
我用的是模版类 所以我试了一下其他几种类型 当用float和long double的时候都可以得到正确的结果,就是用double的时候不行
不过用float的时候debug的迭代次数比release要多。
怎么会这样啊!!!!!!!!!!!!!!!!!!!!!
#21
这样我要在vs中写程序了,但以后的程序移植很有问题啊!!!
#22
得看编译开关是啥
另外如果是递归展开的什么的,vc要比gcc慢5倍左右……