首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用C重新解释u64数组,在不改变内存分配的情况下转换为u16的3D数组

使用C重新解释u64数组,在不改变内存分配的情况下转换为u16的3D数组
EN

Stack Overflow用户
提问于 2015-12-27 20:43:58
回答 1查看 108关注 0票数 4

我被难住了,我有一个指向无符号64位整数数组的指针。每个64位整数实际上表示16位整数,因此应将其拆分为16位数组,例如:

36348941应该写成:

0,0,554,41997

然而,在C中,我看不到执行这种类型转换的方法。我知道C在内存管理方面有很大的潜力,我希望我不必为了执行这个操作而迭代数据,而是简单地改变数据在内存中的解释方式,让处理器分配和释放内存对我的程序来说是很耗时的(它需要尽可能快地运行-最好是少于20毫秒)。

如果我简单地说:

代码语言:javascript
复制
arg1 = *(unsigned short (*))(&arg2);

我发现数据截断了位,所以每64位整数只输出一个值,在上面的情况下应该是41997。

这只是应用程序的另一个棘手问题的第一部分,接下来需要将16位值的数组转换为三维数组,而我可以通过执行以下操作来编译此程序:

代码语言:javascript
复制
const int I = 4;
const int J = 256;
const int K = 256;
arg1 = *(unsigned short (*)[I][J][K])(&arg2);

但这没有给我数据,我已经在其他语言中看到过这种工作,但他们重新分配内存,这是很耗时的,最好是所有这些都发生在处理器中,不需要内存分配,因为它只是要求内存中的位的映射不同,而不是数据本身。

然后,我需要能够将此数据作为指向三维数组的指针传回。这样做的原因是,我正在工作的语言正在做如上所述的内存分配,但每分钟调用C DLL的开销似乎是一个潜在的解决方案。

我也研究过工会,但我现在明白这是使用工会的不正确方式。

我已经很多年没有接触过C语言了,所以如果有任何帮助,我将不胜感激。

EN

回答 1

Stack Overflow用户

发布于 2015-12-27 21:25:05

首先,你不能使用uint16_t *或类似的东西来做这件事。这是因为严格的别名规则:只允许通过某种类型的表达式访问内存,前提是内存最初是通过该类型写入的(有一小部分异常)。

如果你真的想这样做,你也必须依靠编译器扩展来编译一种类似C的语言,但没有严格的别名规则,例如带有开关-fno-strict-aliasing的gcc。

可移植性更好的方法是使用联合:

代码语言:javascript
复制
union U
{
    uint64_t a[10][10];
    uint16_t b[10][40];
};

联合取代了严格的别名规则;您可以将数据写入a并从b中读出。

当然,输出的顺序根据平台的不同而有所不同。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34480499

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档