【发布时间】:2020-07-25 05:54:55
【问题描述】:
C++ 允许对标准数据类型(内置整数和浮点类型)使用算术数学表达式进行积极优化。在这些情况下,在遵守 C++ 标准的同时,编译器可以预先计算文字常量、重新排序操作,甚至完全更改操作等(在某些情况下甚至会偏离标准合规性,就像 -Ofast 优化所发生的那样例如,某些编译器中的级别)。
但现在让我们假设您为标量编写自定义类库并为它们实现算术运算符,甚至为常量定义实现您自己的user-defined literals。
C++ 规范是否提供了某种机制来在您自己的类的运算符中实现与内置整数和浮点类型相同的优化机会?
想象一下,例如,您有以下内容:
#include <cstdint>
class MyFP16
{
private:
std::uint16_t m_val;
public:
MyFP16();
[...other constructors here...]
~MyFP16();
// Arithmetic operators
friend MyFP16 operator+(const MyFP16 &c1, const MyFP16 &c2);
friend MyFP16 operator-(const MyFP16 &c1, const MyFP16 &c2);
friend MyFP16 operator*(const MyFP16 &c1, const MyFP16 &c2);
friend MyFP16 operator/(const MyFP16 &c1, const MyFP16 &c2);
[...rest of arithmetic operators...]
// Other logic needed
[...]
};
我能否以所有运算符都具有与float 内置类型完全相同的语义的方式定义此类,以便所有可用于float 的算术表达式优化也可以用于我的类,利用重新排序操作,交换性/关联性,将一些操作转换为其他操作,预先计算常量结果等......?如何?
非常感谢!
【问题讨论】:
-
你可以尝试看看编译器做了什么。如果没有您的代码,则不清楚其他人应该如何为您做到这一点
-
也许你期待一些通用的答案,但在编译器优化方面没有通用的答案。唯一知道的方法是编写代码,编译它并查看编译器的输出。如果你不知道,这是一个很棒的工具来做到这一点:godbolt.org
-
如果你有代码,你可以编译它,看看编译器是否应用了你期望的优化。
-
@cesss 不,你不能告诉编译器你的运算符的数学属性,除非你的编译器支持这样的特定属性。我认为他们通常不会这样做。
-
@2785528 请争论到底 C++ 运算符语义如何属于编译器而不是 C++。这个问题不是关于编译器,而是关于定义与内置类型具有相同语义的运算符,以便这些语义可以用于优化。我将编辑问题以删除“编译器”字样。
标签: c++ operators literals arithmetic-expressions