查看单个帖子
  #91 (permalink)  
旧 2008-03-07
sjinny 的头像
sjinny sjinny 当前离线
普通会员
 
注册日期: 2008-02-01
帖子: 66
sjinny 正向着好的方向发展
默认 回复: 请教各位大大关于动态内存管理的问题……

如果我要“让某个对象在出了scope以后立即析构”,那么我会用栈。
我并不是说gc能不能猜出是否有错,我是说这种情况下就应该用栈而不是丢给gc。

我说的“至于那些优化,如果会损及语义,那么很可能是不合算的。”是指ajoo所说的“允许对象进行超光速空间跳跃”。他还给了前提“优化开关打开的情况下”,而如果这种优化会损及语义,那么即使在文档中有所记录也仍然会增加风险。我对编译器优化并不很了解,所以我加了句“如果会损及语义”。

代码:
//code 1 for( int i = 0; i < 10000; ++i ) GetTickCount();
从人的角度看,这段代码没什么意义,所以如果被优化掉也无所谓。但是如果编译器不知GetTickCount的效果也优化掉那么就会损坏语义了,因为这个函数可能会修改一些持续性的状态,而循环调用它的目的也正是修改持续性状态。

代码:
//code 2 for( int i = 0; i < 10000; ++i ) 0; //code 3 for( int i = 0; i < 10000; ++i ) __asm nop
这两段代码看不懂。

代码:
//code 4 for( int i = 0; i < 10000; ++i ) Sleep( 1 );
理论上说,Sleep(1)和Sleep(10000)的效果很可能很不同。比如假设某个操作系统之中,Sleep(1)的意思是“如果别人有事,那么我暂时等一下,如果没人有事那么我会继续”,这个循环就是设置一个特殊的时间段,如果有必要的话才让出CPU;而Sleep(10000)则是等待10秒,是个并不紧急的任务,可能os会把它的优先级调低、停顿会比前者长。我的意思是,有时参数值的不同会使函数的实际效果有所不同,所以这段其实不该优化。


如果要说优化,编译器最好是根据程序员的要求来说,或者只做一些保守的优化。
回复时引用此帖