我在 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())
电话不会受到伤害。