C++ 结构和 volatile

标签 c++ struct volatile

我有一些 C 代码,希望可以过渡到 C++,作为第一步,我正在尝试使用 C++ 编译器(现在是 g++)来编译这些代码。

它使用一些用于 IPC 的共享内存段,并且指向这些段的指针被声明为 volatile:

volatile my_rec_t *myRec;

(其中 my_rec_t 只是一个普通的旧数据结构,而 myRec 是作为这些结构的数组访问的)。

我对这个数据结构的易变性有一些疑问:C++ 似乎比 C 需要更多的转换,我不太确定我理解为什么......

有一些自动生成的访问器函数可以获取/设置共享内存结构中的字段(目前都是 C 风格的代码)。这适用于原始数据类型,但是 my_rec_t 中的字段之一本身就是一个结构,它会产生错误:

int setIndexNode( int myRecNo, index_node_t indexNode )
{
  myRec[ myRecNo ].indexNode = indexNode;
  return TRUE;
}

在 C++ 中,这会生成以下内容:错误:将“volatile index_node_t”作为“index_node_t& index_node_t::operator=(const index_node_t&)”的“this”参数传递会丢弃限定符。为了获得值(value):

index_node_t getIndexNode( int myRecNo )
{
  return myRec[ myRecNo ].indexNode;
}

错误是error: no matching function for call to 'index_node_t::index_node_t(volatile index_node_t&)'

get 问题更让我感到困惑,因为结构是按值传递的,所以返回值作为拷贝,自然会失去它的波动性吗?对于 set 情况,就读取数据而言,波动性肯定更重要,以防另一个进程更改数据 - 我真的不知道写入数据位置时 volatile 意味着什么。

注意:为了这个例子的目的,代码片段被删减了,里面有各种锁定和边界检查代码:)

最佳答案

对于 getIndexNode,答案似乎相当简单:const_cast 在返回波动性之前消除波动性,因为这是您预期的语义。请注意,只要 volatile 指针指向的内存最初未声明为 volatile,就可以完美地定义丢弃它。

对于复制赋值运算符,您可以尝试将其设为 volatile,尽管您没有显示足够的代码来确定这是否会解决您的问题。例如 index_node_t& index_node_t::operator=(const index_node_t&) volatile

关于C++ 结构和 volatile ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23891884/

相关文章:

C错误: `arithmetic on pointer to an incomplete type`

swift - 如何在 Swift 中读取结构的字节

c - 如何声明具有 volatile 元素的静态数组?

java - 我是否正确理解了 JSR-133 Cookbook 中的 Can Reorder 规则?

数组维度中的 C++ 模板参数

c++ - 我如何清除状态栏文本 wxwidgets C++

c++ - 指针函数的深拷贝

c++ - 类似命名空间的宏功能

java - 为什么访问 volatile 变量比 member 慢 100 左右?

java - Java中的结构类对象