设置一个双字节数组

时间:2018-08-16 13:10:35

标签: c embedded double variable-assignment

在字节数组中分配double到8个字节的快速方法是什么?

我有一个大约4k字节大的字节数组,并且我尝试从中取出8个字节并将其复制到double中。由于速度原因,我试图避免使用memmove和memcpy,因为分配变量要快得多。我在嵌入式世界中工作,任何其他快速实现都值得赞赏。

void foo(double *pdest)
{
   // Try 1: I am using 1 element in the array, it won't work
   *pdest = (double)p->stk[stkpos];

   // Try 2: I am attempting to loose the single element element
   *pdest = (double)((double*)&p->stk[stkpos]);
}

两种解决方案都不适合我,我不确定如何实现这一目标。

3 个答案:

答案 0 :(得分:6)

如果编译器没有被严重破坏,则通过赋值运算符进行的复制应与Activity currentActivity = ((MyApp)context.getApplicationContext()).getCurrentActivity(); 大致相同。因此,您正在尝试的只是“过早优化”。

您不能 编写类似memcpy的代码,因为这会引起未定义的行为。请参见What is the strict aliasing rule? *pdest = (double)p->stk[stkpos];,但不附带该错误。

解决方案:使用memcpy

答案 1 :(得分:5)

假设p->strk是字节数组:

这不起作用:

*pdest = (double)p->stk[stkpos];

因为您只读取一个字节并将该值分配给double

这不起作用:

*pdest = (double)((double*)&p->stk[stkpos]);

由于外部演员。第一部分,将&p->stk[stkpos]括在double *中,实际上会为您提供一个指向double的指针,该指针始于&p->stk[stkpos]的地址,但随后您将该指针的值,即指向double的内存地址(不是指向的内容)。

您可能正在尝试执行的操作:

*pdest = *((double*)&p->stk[stkpos]);

这将获取地址p->stk[stkpos],将其视为指向double的指针,并取消引用该地址以读取一个double。

但是,这仍然有问题。这种转换违反了严格别名。即使禁用了严格的别名,您最终也可能会遇到未对齐的内存访问。

执行此操作的正确方法是使用memcpy。这样可以保证按预期工作。

答案 2 :(得分:-3)

我认为您的演员阵容已关闭。您需要指出您正在引用一个指向double的指针,然后取消对其的引用。

*pdest = *((double *)(&p->stk[stkpos]));

应该工作