将多维数组转换为另一种类型的多维数组
Cast multidimensional array to multidimensional array of another type
我有
const uint8_t longByteTable[16][256][16] = { { { 0x00, ... } } };
声明为硬编码八位字节值的三维 16x256x16 数组。
出于优化目的和其他各种原因,我需要将此数组解释为 uint64_t 值的三维 16x256x2 数组:
const uint64_t reinterpretedTable[16][256][2];
我需要的是一种有效的投射方式 longByteTable
到 reinterpretedTable
在严格 ISO/ANSI C 内。这是:
const uint64_t (*reinterpretedTable)[256][2] =
(const uint64_t(*)[256][2])longByteTable;
正确的方法?
P.S。我不能用后一种类型声明 longByteTable
因为那样它就不能在不同的字节序下正常工作,我要么需要为不同的字节序声明不同的表,要么执行一些运行时检查和轮换。是的,重新解释的数组的所有进一步转换都是字节顺序不变的。
由于 C 的指针别名规则,您不能进行此类转换。唯一安全的方法是使用联合:
typedef union
{
uint8_t longByteTable[16][256][16]
uint64_t reinterpretedTable[16][256][2];
} table_t;
const table_t table;
但请注意,这仍然会使您的代码依赖字节顺序。使代码与字节序无关的唯一方法是使用位移位分配值 to/from 更大的整数类型。
我有
const uint8_t longByteTable[16][256][16] = { { { 0x00, ... } } };
声明为硬编码八位字节值的三维 16x256x16 数组。
出于优化目的和其他各种原因,我需要将此数组解释为 uint64_t 值的三维 16x256x2 数组:
const uint64_t reinterpretedTable[16][256][2];
我需要的是一种有效的投射方式 longByteTable
到 reinterpretedTable
在严格 ISO/ANSI C 内。这是:
const uint64_t (*reinterpretedTable)[256][2] =
(const uint64_t(*)[256][2])longByteTable;
正确的方法?
P.S。我不能用后一种类型声明 longByteTable
因为那样它就不能在不同的字节序下正常工作,我要么需要为不同的字节序声明不同的表,要么执行一些运行时检查和轮换。是的,重新解释的数组的所有进一步转换都是字节顺序不变的。
由于 C 的指针别名规则,您不能进行此类转换。唯一安全的方法是使用联合:
typedef union
{
uint8_t longByteTable[16][256][16]
uint64_t reinterpretedTable[16][256][2];
} table_t;
const table_t table;
但请注意,这仍然会使您的代码依赖字节顺序。使代码与字节序无关的唯一方法是使用位移位分配值 to/from 更大的整数类型。