gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 02:12:23 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com