在 C++ 中将指针转换为 volatile void**

Posted

技术标签:

【中文标题】在 C++ 中将指针转换为 volatile void**【英文标题】:Casting a pointer to a volatile void** in C++ 【发布时间】:2011-12-12 00:17:04 【问题描述】:

我有相当不错的 C++ 技能,但是这个演员给我带来了问题。我有一个接受以下参数的函数:(volatile void **, void * , void*)。我有 3 个int* 变量,我试图将它们作为(&var1, var2, var3) 传递。但是,我收到以下错误:Cannot convert parameter 1 from int** to volatile void**。是否需要制作特定的演员表才能做到这一点?下面是我正在使用的代码 sn-p。非常感谢任何帮助。

int* pVal = InterlockedCompareExchangePointer(&cur_val, new_val, old_val);

这是在 Windows XP 机器上的 VS2010 中完成的。

【问题讨论】:

对不起,InterlockedCompareExchangePointer 返回什么? 这是通常的 CAS 习语:CAS(storage, new_val, expected_old_val),它返回在位置 storage 中找到的旧值 -- msdn.microsoft.com/en-us/library/windows/desktop/… 嘿我不确定这一点,但我怀疑你是否可以在函数调用中将非易失性变量转换为易失性。尝试使原始指针变为 volatile 并查看它是否有效? @Ankit:反过来说:你可以安全地从非易失性转换到易失性,但反过来却不行。 【参考方案1】:

第一个应该是volatile void **,你有int **。您可以直接转换为volatile void**,或者(更好)将原始变量声明为volatile,然后再转换。

volatile 表示该变量可以在代码之外的其他地方更改,基本上这意味着该变量不会被优化,但由于您的原始变量未定义为volatile 它可能仍会被优化,你会得到不正确的结果。

【讨论】:

【参考方案2】:

您可以使用const_cast,但最好的方法是您可以将变量声明为volatile int*(即指向volatile int 的指针),否则结果可能是未定义的。

InterlockedCompareExchangePointer 执行的操作可能超出优化器的分析范围,因此变量为volatile 以确保每次都从内存中获取其值(而不是缓存在寄存器等中),这一点很重要正在使用中。

【讨论】:

【参考方案3】:

除了将 int 声明为 volatile 之外,还需要将其转换为:

int* pVal = (int *)InterlockedCompareExchangePointer((void **)&cur_val, (void *)new_val, (void *)old_val);

还要注意函数返回值的转换。它返回一个 void *,所以它必须转换为 int *。

C++ 需要显式转换。

【讨论】:

以上是关于在 C++ 中将指针转换为 volatile void**的主要内容,如果未能解决你的问题,请参考以下文章

在 C++ 中将指针转换为数组形式的问题?

在 C 和 C++ 中将 int 值转换为 char 指针差异

在 C / C++ 中将 int* 转换为 int(*)[n]

C++中将对象this转换成unsigned char指针

如何在c ++中将int数组转换为字节数组[重复]

映射GPU内存时应该使用volatile吗?