设置一个双字节数组

Mat*_*att -3 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]);
}
Run Code Online (Sandbox Code Playgroud)

这两种解决方案都没有对我有用,我不确定如何实现这一目标.

Lun*_*din 6

如果您的编译器没有被严重破坏,则通过赋值运算符复制应该或多或少相同memcpy.所以你所尝试的只不过是"预成熟优化".

不能编写代码,*pdest = (double)p->stk[stkpos];因为它会调用未定义的行为.请参阅什么是严格别名规则? memcpy但是,没有那个bug.

解决方案:使用memcpy.


dbu*_*ush 5

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

这不起作用:

*pdest = (double)p->stk[stkpos];
Run Code Online (Sandbox Code Playgroud)

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

这不起作用:

*pdest = (double)((double*)&p->stk[stkpos]);
Run Code Online (Sandbox Code Playgroud)

因为外部演员.第一部分,&p->stk[stkpos]对一个double *遗嘱的套管实际上给你一个指向一个double从地址开始的指针&p->stk[stkpos],但是然后你把那个指针的,即一个内存地址(不是它所指向的)转换为一个double没有合理.

您可能正在尝试做什么:

*pdest = *((double*)&p->stk[stkpos]);
Run Code Online (Sandbox Code Playgroud)

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

但是,这仍然存在问题.这种转换违反了严格的别名.即使禁用了严格的别名,最终也可能导致内存访问错位.

正确的方法是使用memcpy.这保证按预期工作.