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.这保证按预期工作.
| 归档时间: |
|
| 查看次数: |
97 次 |
| 最近记录: |