【发布时间】:2020-08-20 06:21:03
【问题描述】:
我试图通过引用一个构造函数来传递自定义对象的 std::vector,该构造函数将其复制/移动到另一个私有 std::vector 成员,但是以某种方式在 for 循环中逐个元素复制它会生成一个较小的程序比一次移动整个向量时的大小。
通常我的构造函数中有这段代码:
constructor(std::vector<object*>& newVec)
{
for(int i=0; i<newVec.size(); ++i)
this->vec.push_back(newVec[i]);
}
这会生成一个比使用 std::move 更小的 Linux 可执行文件,如下所示:
constructor(std::vector<object*>& newVec)
{
this->vec=std::move(newVec);
}
只有通过切换这两个 sn-ps,我才能从 30kB 大小传递到 35kB。
PS:向量中包含的对象与构造函数对象不同。
谁能解释一下为什么前一个版本比后一个版本更优化?
【问题讨论】:
-
二进制大小 =/= 优化级别 =/= 速度。
-
您是专门询问优化输出二进制大小,还是将大小优化与其他类型的优化混为一谈?
-
未使用的模板函数不会生成,因此,如果它是您移动矢量的唯一位置...
-
尝试godbolt.org比较生成的程序集。
-
也许值得注意的是,这两个 sn-ps 并不等价。第二个将使参数为空,这可能不是您想要的。