VS2005最大化速度 优化的问题。

chenjiawei007 2011-08-11 02:44:50
我的一个小代理工具,在串口通讯时,DEBUG问题没有问题,RELEASE 版本不开优化也没有问题。

但是开启优化,无论是最大化速度,还是最小化大小,

加入调试信息跟断点发现,有些接口,刚进去就被直接RETURN了。

导致一些代码一直没有运行的,有经验的朋友,请指教下!
...全文
259 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2011-08-12
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 chenjiawei007 的回复:]
谢谢各位哦,我加了volatile还是没有解决问题,以后RELEASE还是不开优化了,和朋友交流了下,优化多线程时会带来一些灾难性的问题,我对优化理解也不深入,谢谢各位帮忙解答。
[/Quote]
多线程共享数据需要加锁避免访问冲突。
chenjiawei007 2011-08-11
  • 打赏
  • 举报
回复
谢谢各位哦,我加了volatile还是没有解决问题,以后RELEASE还是不开优化了,和朋友交流了下,优化多线程时会带来一些灾难性的问题,我对优化理解也不深入,谢谢各位帮忙解答。
赵4老师 2011-08-11
  • 打赏
  • 举报
回复
对有些变量需要加volatile关键字吧。
chenjiawei007 2011-08-11
  • 打赏
  • 举报
回复
单步跟了,优化后代码进入这个接口,直接到了最后。

像是优化后进入了我第二行的RETURN0. 我把这个保护IF注释掉,就可以收到数据了。

但是单步断点也没有进入到这个RETURN 0.

还有我确实是多线程的操作,因为串口需要一个线程去实时读。
至善者善之敌 2011-08-11
  • 打赏
  • 举报
回复
归根揭底还是程序有BUG,单步可以追踪吗?
ifengshow 2011-08-11
  • 打赏
  • 举报
回复
学习下
chenjiawei007 2011-08-11
  • 打赏
  • 举报
回复

int CSuperAlarmDeviceUnit::RecvCommData(char* buf, int nLen)
{

//如果不屏蔽掉这个IF 这个接口会直接被屏蔽掉,使得我串口数据收不到。
if (m_hCom == INVALID_HANDLE_VALUE)
{

return 0;

}

DWORD read_len = 0;

int nSumRead = 0;

bool isRead = false;

//如果一直没有收到结束包,将等待数据
int nBreakTimes = 0;

while( buf[nSumRead-1] != -86 )
{

ReadFile(m_hCom, (char*)buf+nSumRead, nLen, &read_len, NULL);

nSumRead += read_len;

Sleep( 100 );

//如果3S内没有收到包尾,则返回.
if ( ++nBreakTimes == 30)
{

//print_data("未收到包尾,放弃包数据", buf, nSumRead);

return 0;

}

}

return nSumRead;

}


不知道我的代码哪里有问题,屏蔽掉这个IF语句就可以收到数据,但是数据的接受速度有了些问题,

有清楚VS2005优化功能的朋友给点意见~
贪食蛇男 2011-08-11
  • 打赏
  • 举报
回复
据我观察的,编译器可能的优化:
1. 展开小的函数,如:

int a(int i, int j)
{
_asm push eax
_asm pop eax
}

int main()
{
_asm mov eax, eax
a(1, 2);
_asm mov ebx, ebx
}

这种情况下调用a,可能为了节约压栈出栈而把函数在调用处展开。
生成代码如下:

int main():
_asm mov eax, eax
_asm push eax
_asm pop eax
_asm mov ebx, ebx


2. 跳过不必要的计算,和不进行未使用的计算。如:

int main()
{
int* p = 0;
*p = 0;
return;
}

这种写法,生成的代码中,可能直接把 *p = 0; 一句去掉,造成程序运行并不崩溃。因为编译器检查到局部指针 p 未被引用过,
所以在生成代码的时候不必为指针指向的内存区写数据,甚至直接不为这个指针在栈上分配空间。

你所说的一些代码一直没运行,可能是这些函数在调用中被优化掉,根据 2 的扩展,可以推出:

3. 如果一个函数里没有有效运算,则此函数可以优化掉,如:

void a()
{
int* p = 0;
*p = 0;
}

int main()
{
a();
}

这种情况下,先对 a 函数进行优化,优化成了空函数:
void a()
{
}

然后在 main 调用时,再次把这个调用优化掉。

针对这些情况,你可以在函数调用前后加花指令,然后反汇编看生成的代码,如:

int main()
{
_asm mov eax, eax;
_asm mov ebx, ebx;
a();
_asm mov eax, eax;
_asm mov ebx, ebx;
}

如果调用被优化掉,则一目了然,否则会有一些 call 指令或 a 函数的展开。
luciferisnotsatan 2011-08-11
  • 打赏
  • 举报
回复
没代码没真相。
只要你没写 i+++i 这种有副作用的代码,而且不是多线程的,应该不会有什么问题。

64,683

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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