mdspan 和严格的别名规则
mdspan and the strict aliasing rule
如果我没记错的话,由于严格的别名规则,通过指针运算访问多维数组的第二行以上是未定义的行为。
有一个提案,叫做 mdspan
,在我看来,它旨在提供一个多维数组视图。如何在不违反严格的别名规则的情况下实现这样的 class?
解决方法可能是 reinterpret_cast
将数据来回 char *
。但是,我去this reference implementation看了一下,并没有看到这样的东西。
这是参考实现的摘录:
template < typename DataType , class ... Properties >
class mdspan
{
public:
// ...
using element_type = DataType ;
using pointer = element_type * ;
using reference = element_type & ;
private:
pointer m_ptr ;
mapping m_map ;
public:
// ...
template < class ... IndexType >
explicit constexpr mdspan
( pointer ptr , IndexType ... DynamicExtents ) noexcept
: m_ptr(ptr), m_map( DynamicExtents... ) {}
// ...
template< class ... IndexType >
constexpr reference
operator()( IndexType ... indices) const noexcept
{ return m_ptr[ m_map( indices... ) ]; }
};
我意识到我误解了整件事。该提案明确指出:
The proposed polymorphic multidimensional array reference (mdspan
) defines types and functions for mapping indices from a multidimensional index space (the domain) to members of a contiguous span of objects (the codomain).
因此它被设计为一维数组的多维视图,不存在别名问题。
我在别处读到它旨在替换像 f(double [][5],int)
这样的代码,这让我感到困惑。
如果我没记错的话,由于严格的别名规则,通过指针运算访问多维数组的第二行以上是未定义的行为。
有一个提案,叫做 mdspan
,在我看来,它旨在提供一个多维数组视图。如何在不违反严格的别名规则的情况下实现这样的 class?
解决方法可能是 reinterpret_cast
将数据来回 char *
。但是,我去this reference implementation看了一下,并没有看到这样的东西。
这是参考实现的摘录:
template < typename DataType , class ... Properties >
class mdspan
{
public:
// ...
using element_type = DataType ;
using pointer = element_type * ;
using reference = element_type & ;
private:
pointer m_ptr ;
mapping m_map ;
public:
// ...
template < class ... IndexType >
explicit constexpr mdspan
( pointer ptr , IndexType ... DynamicExtents ) noexcept
: m_ptr(ptr), m_map( DynamicExtents... ) {}
// ...
template< class ... IndexType >
constexpr reference
operator()( IndexType ... indices) const noexcept
{ return m_ptr[ m_map( indices... ) ]; }
};
我意识到我误解了整件事。该提案明确指出:
The proposed polymorphic multidimensional array reference (
mdspan
) defines types and functions for mapping indices from a multidimensional index space (the domain) to members of a contiguous span of objects (the codomain).
因此它被设计为一维数组的多维视图,不存在别名问题。
我在别处读到它旨在替换像 f(double [][5],int)
这样的代码,这让我感到困惑。