1

volatile似乎是每个人一个永无止境的问题。我以为我什么都知道,但后来我遇到了这个:

所以,我在线程之间共享了一块内存,我这样定义它:

volatile type *name;

如果它让你感觉更好,你可以想象type它只是一个int.

这意味着我有一个指向一些易失性数据的指针(非易失性)。因此,例如在优化时,编译器可以缓存namebut not的值name[0]。我对吗?

所以,现在我正在vfree输入这个指针(它在 Linux 内核模块中),它告诉我在传递它时会vfree期望。const void *volatile type *

volatile type *我了解将 a作为 a传递是多么危险,type *因为在该函数中,name[i]可以缓存的值(作为优化的结果),这是不可取的。

我不明白为什么,vfree希望我向它发送一个指向非易失性数据的指针。那里有我想念的东西吗?还是只是写信的人vfree没有考虑这种情况?

我假设我只是将指针指向void *不会造成任何伤害,对吗?

4

2 回答 2

2

vfree函数(以及一般每个理智的释放函数)并不关心您的实际数据(不管是否volatile如此)。它只需要一个(有效的)指针(想想:将指针作为longCPU 寄存器中的值传递)。

基于该值,该函数将:

  1. 调用 SLAB/SLUB 释放内存
  2. 删除内存映射

所以是的,转换为 avoid *不会在运行时造成任何伤害。

于 2011-10-18T14:38:57.047 回答
0

我的结论是,仅将指针转换为void *不会导致问题,free并且vfree不直接接受指向volatile数据的指针这一事实只是被忽略了。

于 2011-10-21T11:07:29.807 回答