我被难住了,我有一个指向无符号64位整数数组的指针。每个64位整数实际上表示16位整数,因此应将其拆分为16位数组,例如:
36348941应该写成:
0,0,554,41997
然而,在C中,我看不到执行这种类型转换的方法。我知道C在内存管理方面有很大的潜力,我希望我不必为了执行这个操作而迭代数据,而是简单地改变数据在内存中的解释方式,让处理器分配和释放内存对我的程序来说是很耗时的(它需要尽可能快地运行-最好是少于20毫秒)。
如果我简单地说:
arg1 = *(unsigned short (*))(&arg2);我发现数据截断了位,所以每64位整数只输出一个值,在上面的情况下应该是41997。
这只是应用程序的另一个棘手问题的第一部分,接下来需要将16位值的数组转换为三维数组,而我可以通过执行以下操作来编译此程序:
const int I = 4;
const int J = 256;
const int K = 256;
arg1 = *(unsigned short (*)[I][J][K])(&arg2);但这没有给我数据,我已经在其他语言中看到过这种工作,但他们重新分配内存,这是很耗时的,最好是所有这些都发生在处理器中,不需要内存分配,因为它只是要求内存中的位的映射不同,而不是数据本身。
然后,我需要能够将此数据作为指向三维数组的指针传回。这样做的原因是,我正在工作的语言正在做如上所述的内存分配,但每分钟调用C DLL的开销似乎是一个潜在的解决方案。
我也研究过工会,但我现在明白这是使用工会的不正确方式。
我已经很多年没有接触过C语言了,所以如果有任何帮助,我将不胜感激。
发布于 2015-12-27 21:25:05
首先,你不能使用uint16_t *或类似的东西来做这件事。这是因为严格的别名规则:只允许通过某种类型的表达式访问内存,前提是内存最初是通过该类型写入的(有一小部分异常)。
如果你真的想这样做,你也必须依靠编译器扩展来编译一种类似C的语言,但没有严格的别名规则,例如带有开关-fno-strict-aliasing的gcc。
可移植性更好的方法是使用联合:
union U
{
uint64_t a[10][10];
uint16_t b[10][40];
};联合取代了严格的别名规则;您可以将数据写入a并从b中读出。
当然,输出的顺序根据平台的不同而有所不同。
https://stackoverflow.com/questions/34480499
复制相似问题