在字节数组中分配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]);
}
两种解决方案都不适合我,我不确定如何实现这一目标。
答案 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]));
应该工作