是否允许编译器省略对指针的 &* 运算符的组合调用?

Is the compiler allowed to omit a combined call to &* operators for pointer?

本文关键字:运算符 组合 调用 指针 编译器省 是否      更新时间:2023-10-16

我有这个模板函数

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_tSTL 容器的迭代器,这些容器具有满足LegacyContiguousIterator要求的迭代器。

该函数有效,但我不确定当it是指针时调用&*it的性能。需要运算符从迭代器中获取指针,如本答案中所述,但对于 POD 指针来说似乎有些矫枉过正。是否允许编译器只删除操作,或者最好为指针编写专用化

对于指针,由于 as-if 规则允许它,因此

是。在这种情况下,如果it不是指针,而是具有重载取消引用运算符的对象,则编译器无法执行此操作。

如果it是一个指针,那么&*将是一个noop。

但是,无论如何,每当您声称以下内容时:

我不确定 [...]

的性能

你真的需要能够衡量差异。如果你不能,你可能什么都不担心。

在这种情况下是错误的,因为您使用的迭代器不是指针,而只是具有取消引用运算符的对象,因此在这种情况下不能应用对指针有效的基本规则。

有关详细信息,请参阅假设规则