如果我要“让某个对象在出了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会把它的优先级调低、停顿会比前者长。我的意思是,有时参数值的不同会使函数的实际效果有所不同,所以这段其实不该优化。
如果要说优化,编译器最好是根据程序员的要求来说,或者只做一些保守的优化。