C++ 我的程序跳过返回语句
我的程序具有以下功能:C++ 我的程序跳过返回语句,c++,g++,C++,G++,我的程序具有以下功能: 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(),
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;
}
我已经尝试过几次从头开始重新编译,事先删除可执行文件和所有对象文件,但它仍然这样做
奇怪的是,如果我注释掉return语句并尝试编译,它只会给出警告:在返回non-void的函数中没有return语句。我本以为在返回某些内容的函数中不提供return语句将是一个编译器错误,但我猜不是
我意识到这并不多,但有人知道为什么会发生这种情况吗?检查什么?在这一点上,我甚至不知道从哪里开始寻找
编辑:为了澄清,我正在使用-O0
进行编译
根据tjm的说法,我的gcc版本将仍然使用RVO,即使带有-O0
编译器标志,所以这毕竟是问题所在。谢谢你们的帮助,伙计们。C++源代码不必与生成的目标代码一一对应,只要行为保持不变。这里发生的是编译器重新排列代码,并可能调用
编辑:
将此添加到GCC选项中:-fdump tree nrv
以通过编译器查看NRVO应用程序(您将获得一个扩展名为.nrv
的文件)。这仅适用于大于-O0
的优化级别
没有优化,用复制构造函数或复制赋值操作符调用替换<代码>返回<代码>语句仍然是C++前端转换,它不被代码> GDB <代码>优雅地处理。
< P>我可以想到返回语句可能跳过的几个原因——这些情况都可以吗?
- 在第519行抛出异常。考虑到第521行被击中,这听起来不太可能
- 编译器已优化了返回语句行-您是否正在调试正确的调试生成(未启用优化)
该函数工作正常吗?被调用方是否返回结果并继续它的快乐方式?是否正确分配和初始化了map和pt对象
如果从第519行抛出异常,那么该方法将不会正常返回。在这种情况下,当堆栈展开时,您可能期望下一行“已执行”为第521行
我在Visual C++中看到了很多这类代码,当代码执行了一些导致“未定义行为”的事情。我没有足够的g++经验来知道观察到的行为是否相同。您是否在没有优化的情况下编译(-O0
)?如果不是,那么这可能是命名返回值优化的一个实例。我将把这一点添加到问题中。虽然我是用-O0
编译的。@Max,我对RVO知之甚少,但如果Nikolai链接中的第一个示例是关于是否发生这种情况的有效测试,那么当我在这里编译它时,似乎gcc 4.4.4会做到这一点,即使你用-O0
编译@tjm:有趣。因此,gcc似乎在使用RVO,而不管是否使用-O0
。这可能回答了我的问题@尼古拉:我编译并运行了-fdump tree nrv
,没有-O0
,但我在任何地方都看不到.nrv文件。它到哪里去了?它应该和源文件在同一个目录下,同名。它至少需要-O1
(无优化标志表示无优化)。生成的文件是硬读的:)一旦被调用方尝试使用函数返回的向量,我的程序就会出错。我假设这是因为我的程序试图使用一个空向量,但在函数调用后单步执行显示被调用方是一个大小正确的向量。这听起来像是对返回值的优化,但我使用的是O0
。没有引发异常。我的程序在遍历从该函数返回的向量后,最终会出现故障。尽管这个问题似乎与跳过的return语句无关。
Breakpoint 1, yarl::level::Level::getItemsAt (this=0x80d4d58, pt=...)
at src/Level.cpp:519
519 map.setHasItem(pt, false);
(gdb) next
521 }
(gdb)