c++ - 有没有办法在非复合操作时防止构造?

标签 c++

我有一个 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/

相关文章:

c++ - 在 Ubuntu 中通过终端运行 C++ 时遇到问题

c++ - 我的计算函数没有返回任何东西?

c# - 有效地检查 List<List<int>> 中的数字是否仅以正数或负数存在

c++ - 如何将嵌套模式与 QRegularExpression 匹配?

c++ - read was not declared 错误信息

c++ - llvm,通过 C++ API 定义字符串和数组

c++ - 编码可执行文件

c++ - C++ 中的二进制搜索函数返回无限循环

move : Valid use-case? 后使用 C++

c++ - 如何在 C++ 中正确使用 std::mutex 而不会出现死锁和/或竞争?