是否允许编译器省略对指针的 &* 运算符的组合调用?
Is the compiler allowed to omit a combined call to &* operators for pointer?
我有这个模板函数
template <typename T, typename It, std::enable_if_t<std::is_integral<T>::value, int> = 0>
inline T decode(It &it) {
static_assert(std::is_same<typename std::iterator_traits<It>::value_type, std::uint8_t>::value, "invalid");
T* v_p = reinterpret_cast<T*>(&*it);
it += sizeof(T);
return *v_p;
}
用于从原始指针解码整数。该函数可以与具有迭代器特征的任何类型一起使用,即指向std::uint8_t
的指针或用于std::uint8_t
STL 容器的迭代器,这些容器具有满足LegacyContiguousIterator要求的迭代器。
该函数有效,但我不确定当it
是指针时调用&*it
的性能。需要运算符从迭代器中获取指针,如本答案中所述,但对于 POD 指针来说似乎有些矫枉过正。是否允许编译器只删除操作,或者最好为指针编写专用化
对于指针,由于 as-if 规则允许它,因此
是。但在这种情况下,如果it
不是指针,而是具有重载取消引用运算符的对象,则编译器无法执行此操作。
如果it
是一个指针,那么&*
将是一个noop。
但是,无论如何,每当您声称以下内容时:
我不确定 [...]
的性能
你真的需要能够衡量差异。如果你不能,你可能什么都不担心。
在这种情况下是错误的,因为您使用的迭代器不是指针,而只是具有取消引用运算符的对象,因此在这种情况下不能应用对指针有效的基本规则。
有关详细信息,请参阅假设规则
相关文章:
- 为什么比较运算符如此快速
- C++映射:具有自定义类的运算符[]不起作用(总是返回0)
- 是否允许编译器省略对指针的 &* 运算符的组合调用?
- 当返回语句时,逗号运算符、大括号初始化列表和 std::unique_ptr 组合在一起
- 为什么我"error: expression is not assignable"组合增量运算符
- 编写饱和转换运算符而不列出所有可能的组合
- 如何使用超载 运算符组合两个链接列表
- 覆盖组合对象的<<运算符会给出错误 C++
- 组合 & 和 * 运算符
- 重载运算符 "=" 和 "+" 组合在 C++ 中不起作用
- 如何计算前缀和后缀运算符的组合
- C std::lower_bound,使用重载运算符作为二进制谓词组合
- C++ - 组合复制/移动运算符和构造函数
- 重载用于组合使用向量的两个字典的+运算符
- 运算符的使用=与新运算符组合使用
- 函数组合运算符
- 运算符<<和继承/组合
- 调用枚举<<运算符进行字符串组合
- 重载运算符和继承与模板(强大的组合)
- 关于>>、<<运算符和 cin 和 cout 对象组合的问题