我有一个 vector 类,其中包含加法、乘法、减法、除法等运算符。我正在尝试优化我的程序(它执行大量 vector 操作)并且我意识到大约 50% 的时间花在构造和破坏 vector 上。我明白这是因为每次我为一个 vector 调用一个非复合数学运算符时,都会构造一个新的 vector 。有没有办法在不使用复合运算符或扩展 vector 运算的情况下防止这种情况发生?
如果我有:
Vector a = Vector(x, y, z);
Vector b = Vector(a, b, c);
Vector c = a + b;
我不能使用 +=,因为 c 是一个全新的 vector 。我知道我可以用这个加快速度:
c.x = a.x + b.x;
c.y = a.y + b.y;
c.z = a.z + b.z;
但这似乎不像仅使用运算符那么干净。
最佳答案
I understand that this is because every time I call a non-compound mathematical operator for a vector, a new vector is constructed. Is there a way to prevent this without using compound operators or expanding vector operations?
好吧,将两个事物相加产生第三个事物的本质要求您构建第三个事物……那么您的要求在逻辑上怎么可能呢?
话虽这么说,如果您担心使用加法运算符创建的临时对象,如果您的编译器支持返回值优化,编译器可能会优化这些临时对象。或者,如果你的编译器不支持这个并且你真的想减少临时变量但保留 +
运算符,你可能想要研究模拟 C++0x 移动语义,并提供你的 vector 带有一个右值移动构造函数,当它按值返回一个临时值时将被调用。请参阅 this article 中标题为“移动对象”的部分有关在 C++03 中实现移动语义的信息。一旦 C++0x 出现,您就可以使用 &&
运算符将这些 hack 替换为真正的移动构造函数以获取右值引用。
关于c++ - 有没有办法在非复合操作时防止构造?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1817508/