传递'memcpy'的参数2从指针目标类型中丢弃'volatile'限定符
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了传递'memcpy'的参数2从指针目标类型中丢弃'volatile'限定符相关的知识,希望对你有一定的参考价值。
我有一个volatile char * start_address;
指向寄存器部分(可能会因硬件行为而改变)。我需要阅读它,我正在使用:
memcpy (
result_p, // starting address of destination
start_address, // starting address of source
result_len // for the length of the payload
);
我收到这个警告:
传递'
memcpy
'的参数2从指针目标类型中丢弃'volatile
'限定符
是一种更安全的方式阅读部分或更好的方式来使用memcpy并防止这种警告?
memcpy
与易失性对象不兼容,函数签名中不匹配的指针类型有助于指出这一点。 memcpy
可以以任何顺序复制,以任何单位大小,多次读取源的部分,多次写入目的地的部分,等等。另一方面,volatile
表达了对象的访问顺序和次数的意图正是他们在抽象机器中的样子。如果你想复制volatile
数组,你需要编写自己的副本循环看起来像一个天真的memcpy
,并使用正确的volatile
类型作为循环中的指针。
一般建议不要将memcpy
用于硬件外设寄存器或volatile
限定对象,即使它们占用无间隙内存区域。他们通常需要特定的访问模式memcpy
不保证。这包括使用优化的更宽传输,多次访问相同位置或更改访问顺序。
由于上述原因和以下原因,甚至不考虑扔掉volatile
资格赛!编译器可以很好地优化呼叫(例如,如果您有两个相同的呼叫而不更改源和目标区域之间),则组合两次访问或在其他硬件访问之前/之后移动呼叫。
而是编写自己的复制函数/循环来保持限定符。这将迫使编译器生成完全符合您需要的代码。请记住为复制指针使用正确的类型。另请注意,标准整数类型不是特定大小的硬件寄存器的理想选择。使用来自stdint.h
的固定宽度类型,例如uint8_t
,uint16_t
,....
在C ++中,您可以使用std::copy
。它将采用任何类型的(输入)迭代器,并且指向volatile
的指针是完全有效的输入迭代器。
以上是关于传递'memcpy'的参数2从指针目标类型中丢弃'volatile'限定符的主要内容,如果未能解决你的问题,请参考以下文章
strcpy函数和memcpy函数有啥区别?它们各自使用时应该注意啥问题?