C++ 数组在并集中重叠?
我有这门课:C++ 数组在并集中重叠?,c++,c++11,C++,C++11,我有这门课: template <typename T, ::std::size_t M, ::std::size_t N> struct matrix { private: union { T idata[M * N]; T data[M][N]; } u_; }; 如果没有union,我将无法在constexpr构造函数中初始化矩阵 如果没有union,我将无法在constexpr构造函数中初始化矩阵 事实上,你可以。您只需停止将平面阵列视为构建的一
template <typename T, ::std::size_t M, ::std::size_t N>
struct matrix
{
private:
union
{
T idata[M * N];
T data[M][N];
} u_;
};
如果没有union,我将无法在constexpr
构造函数中初始化矩阵
如果没有union,我将无法在constexpr
构造函数中初始化矩阵
事实上,你可以。您只需停止将平面阵列视为构建的一个解决方案
这将有助于:
template <typename T, ::std::size_t M, ::std::size_t N>
struct matrix
{
template <typename ...U> constexpr matrix(U&&... args);
private:
T idata[M * N];
constexpr T& data( size_t i, size_t j ) { return idata[i*N+j]; }
// I'm sure the class has many other useful members but I'm not listing them
};
模板
结构矩阵
{
模板constepr矩阵(U&…参数);
私人:
T idata[M*N];
constexpr T&data(size_ti,size_tj){return idata[i*N+j];}
//我肯定这个类还有很多其他有用的成员,但我没有列出它们
};
编译器也应该为此生成相同的代码。这有点棘手。这两个数组保证占用相同的空间量,但不允许读取非活动的联合成员,也不允许超出数组界限。编译器可以检测到UB并优化整个代码。因为“一个指向联合的指针,经过适当转换,指向它的所有成员”,我认为这是有保证的。但是,在写入另一个成员后,您无法访问该联盟的一个成员,因为这是未定义的行为。@MatteoItalia:这不会编译,因为
a
是t(*)[M]
,而不是t*
。充其量,您可以使用T*p=&a[0][0]
并使用p[i]
(这基本上就是我所做的)。如果这些数组是布局兼容的,那么通过它们中的任何一个进行访问甚至都将被定义为行为。如果它们有相同的对齐要求,用外行的话说,甚至可能是这样。据我所知,该标准不包含与阵列兼容的布局定义。@KerrekSB:forint(*p)[N]
,是(限于范围0..m
)。但是int*p
并没有这样的限制,所以可以使用落在同一个完整对象中的任何偏移量。既然没有用于聚合的私有或受保护的非静态数据成员(第11条)
,怎么会这样呢?这对我来说是一个限制因素。我的意思是,你不应该提供任何私有成员,否则就我所知,聚合初始化将不起作用。在constexpr
-可用的类型中有私有成员是没有限制的matrix
不是聚合,它的idata
成员是聚合,并且可以根据需要在constexpr
构造函数中初始化,使用您在问题中展示的技术。@用户:它不是类型的完整定义,只是问题中显示的部分。您的问题有一个未在类主体中声明的构造函数。我也这么做了。我只是说明data
可以是一个内联函数而不是数据成员,而不需要对constexpr
构造函数进行任何更改。
template <typename T, ::std::size_t M, ::std::size_t N>
struct matrix
{
template <typename ...U> constexpr matrix(U&&... args);
private:
T idata[M * N];
constexpr T& data( size_t i, size_t j ) { return idata[i*N+j]; }
// I'm sure the class has many other useful members but I'm not listing them
};