我的程序有这个函数:
vector<itemPtr> Level::getItemsAt(const Point& pt)
{
vector<itemPtr> vect(items.size());
// copy all items at pt's position to vect
remove_copy_if(items.begin(), items.end(), vect.begin(),
boost::bind(matchesPosition<itemPtr>, _1, pt));
// update LevelMap and return
map.setHasItem(pt, false);
return vect;
}
这段代码编译没有问题(我使用的是g++,gcc版本为4:4.4.1-1ubuntu2),但是当我运行程序时,它直接跳过了return语句。我使用gdb逐步调试,在前一行设置了断点,得到了以下结果:
Breakpoint 1, yarl::level::Level::getItemsAt (this=0x80d4d58, pt=...)
at src/Level.cpp:519
519 map.setHasItem(pt, false);
(gdb) next
521 }
(gdb)
我已经尝试多次从头重新编译,事先擦除可执行文件和所有对象文件,但它仍然会这样做。
奇怪的是,如果我注释掉return语句并尝试编译,它只会给出“warning: no return statement in function returning non-void”的警告。我本以为在一个返回值的函数中不提供return语句将是编译器错误,但我想可能不是这样。
我意识到这不足以让人理解,但有人知道为什么会发生这种情况吗?要检查什么?此时我甚至不知道从哪里开始查找。
编辑:为了澄清,我正在使用
-O0
进行编译。根据tjm的说法,即使使用
-O0
编译器标志,我的gcc版本仍将使用RVO,所以那就是问题所在。谢谢你们的帮助。
-O0
)?如果没有,那么这可能是“命名返回值优化”(Named Return Value Optimization)的一个实例。 - Philipp-O0
编译了。我会把它加到问题里。 - Max