【问题标题】:What is the meaning of void* volatile* in c++c++中void* volatile*是什么意思
【发布时间】:2015-01-26 16:43:13
【问题描述】:

我正在查看以下代码:

inline void* interlocked_read_acquire(void* volatile* x);

我想知道为什么不只是 volatile void* 作为参数。一般来说,volatile* 的语义或定义是什么?我还假设您可以将volatile* 限定符与除void 之外的任何其他类型一起使用。对吗?

【问题讨论】:

  • 这似乎是有效的,但我不知道如何阅读它,所以这就是我问的原因。
  • 我对投反对票的猜测是,有人只阅读了问题标题,并认为这是一个关于 voidvolatile 孤立含义的非研究性问题。
  • @vsoftco 这肯定是一个相当高的估计(无论如何在 c++ 标签之后的人中) - volatile 是众所周知的,简单指针声明的含义也是如此,所以即使这个特定的组合没有在解决之前没见过
  • @MattMcNabb 同意,也许我应该改变百分比,但是当你第一次碰到它时,有人问你“告诉我这到底是什么”,我敢打赌大多数人不会能够在 5 秒内做出反应。或者也许你可以,但是我必须首先提醒自己volatile 是什么意思,然后提醒自己多指针定义的东西。但无论如何,我不会拒绝这样的问题。

标签: c++ pointers volatile qualifiers


【解决方案1】:

使用cdeclclockwise spiral rule 来破译C 风格的声明:

void* volatile* x
  • 将 x 声明为指向 void 的 volatile 指针

不同于:

volatile void* x
  • 将 x 声明为指向 volatile void 的指针

【讨论】:

  • quantdev,volatile void 是否有意义?还是在演员表中?
  • @vsoftco:这是有道理的——你可以在static_cast 期间添加但不能删除volatile(你还需要使用const_cast),所以确保volatile void* 是@ 987654330@ 有助于防止在访问指向的对象时意外移除波动性。
  • volatile void 如果您假设 void* 不指向 void,它指向具有真实类型但您不知道哪种类型的东西,那么它是有意义的。所以“volatile void*”的意思是“可能是 volatile int*,可能是 volatile double*,可能是 volatile some struct*...”
【解决方案2】:

想知道为什么 [void* volatile* 和] 不只是 volatile void*...?

它们是不同的东西。

  • void* volatile* 是一个指向 volatile (void*) 的指针(因此可以在不强制转换的情况下取消引用和访问 volatile void*,但只会为您提供内存中一些尚未指定的东西的地址)

  • volatile void* 是指向易失性void 的指针(因此在取消引用之前,您必须强制转换为volatile int*volatile My_Class* 之类的类型)

【讨论】:

    【解决方案3】:

    void * ptr1; 表示ptr1 是一个类型为void * 的变量。这种类型表示一个“通用指针”——它指向某个内存位置,但不包含该位置的类型信息。

    void * volatile ptr2;表示变量ptr2也是一个泛型指针,但ptr2也是volatile。关键字volatile 称为cv-qualifier,它的语法规则与const 相同。

    volatile 变量的含义是当其他一些代码说ptr2 时,编译器无法优化它;它必须读取或写入存储ptr2 的内存位置;它必须考虑到某些外部进程也在读取或写入该位置的可能性。

    最后,void * volatile *x 可以指向ptr2。例如,我们可以有 void * volatile * x = &ptr2; 。例如,如果我们写*x = NULL;,那么*x 的类型为void * volatile,这与我们刚刚看到的ptr2 具有相同的含义。

    如果你省略了限定符,编译器会报错,例如void * *y = &ptr2; 。这是因为表达式 *y 将具有类型 void *(非易失性),因此编译器可能会围绕它执行优化,但这是不正确的行为,因为 ptr2 不允许这些优化。 (您可能会认识到“volatile-correctness”与 const-correctness 是同一类东西。

    【讨论】:

      【解决方案4】:

      volatile 是一个附加属性,你可以先删除它来读取

      void* volatile* x
      

      到:

      void* *x
      

      这很熟悉。例如,一个 malloc-ed 内存指针数组。 而且您不会对

      感到困惑
      volatile void*
      

      简化为

      void* x.
      

      【讨论】:

        猜你喜欢
        • 2021-04-03
        • 2012-03-11
        • 2013-03-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-12-08
        • 2020-05-01
        相关资源
        最近更新 更多