使用容器时不同编译器上的 RVO



我在 c++17 上有以下代码

template<typename T>
std::vector<T*> getPointerVector(std::vector<T> base) {
auto out = std::vector<T*>();
for (auto& t : base) {
out.push_back(&t);
}
return out;
}

据我了解,RVO 应该启动并防止对返回的矢量进行任何复制。但是,当我使用 GCC 时,它一切正常,使用 msvc 则不然,并且矢量实际上是复制的。有什么解释吗?谢谢!

编辑: 调试时,我确保内存中的引用对于函数内部和调用端的向量是相同的。对于 debian 测试的 gcc 8.3 来说如此,对于 Visual Studio 19.4 上的 msvc 来说则不然

显然你的Visual Studio版本没有这样做。

或。。。

调试时,我确保内存中的引用对于函数内部和调用端的向量是相同的。对于 debian 测试的 gcc 8.3 来说如此,对于 Visual Studio 19.4 上的 msvc 来说则不然

如果您正在调试,大概您正在进行调试构建,优化通常不那么激烈。所以可能只是你关闭了这个。

它至少会移动矢量,所以就是这样。

顺便说一下,你要返回的向量的每个元素都是一个悬空的指针。你的意思是引用base吗?此外,out.reserve(base.size())电话不会受到伤害。

最新更新