传递'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_tuint16_t,....

另一答案

在C ++中,您可以使用std::copy。它将采用任何类型的(输入)迭代器,并且指向volatile的指针是完全有效的输入迭代器。

以上是关于传递'memcpy'的参数2从指针目标类型中丢弃'volatile'限定符的主要内容,如果未能解决你的问题,请参考以下文章

函数参数传递指针变量

strcpy函数和memcpy函数有啥区别?它们各自使用时应该注意啥问题?

strcpy&memcpy理解

没有指针,我可以在 Python 中将引用作为参数传递吗? [复制]

js得到函数的参数值,怎么得到传递的函数的参数?

thinkphp中的函数怎么传多个参数