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)
这两种解决方案都没有对我有用,我不确定如何实现这一目标.
如果您的编译器没有被严重破坏,则通过赋值运算符复制应该或多或少相同memcpy
.所以你所尝试的只不过是"预成熟优化".
您不能编写代码,*pdest = (double)p->stk[stkpos];
因为它会调用未定义的行为.请参阅什么是严格别名规则? memcpy
但是,没有那个bug.
解决方案:使用memcpy
.
假设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
.这保证按预期工作.