const-correctness和硬件写入

Const-correctness and hardware writes

本文关键字:硬件 const-correctness      更新时间:2023-10-16

说我有以下成员函数:

void CFoo::regWrite( int addr, int data )
{
  reg_write( addr, data ); // driver call to e.g. write a firmware register
}

清楚,调用此函数不会修改调用对象的内部状态。但是,它更改了此Foo实例代表

的状态

在这样的情况下,Foo::regWrite(int addr, int data)应该是const函数吗?

您必须决定 CFoo的"逻辑上const"的含义,这取决于类是什么。

如果CFoo被解释为参考某些数据,那么能够通过CFooconst实例修改该数据可能是有意义的,在这种情况下,您的成员函数将为const。为此,请考虑其他类型的参考某些数据 - 您可以修改char *constconst std::unique_ptr<char>的推荐。

如果CFoo被解释为拥有某些数据的,那么通过CFooconst实例禁止修改可能是有意义的。为了考虑此示例,考虑容器,即使元素在物体上不是物体的一部分时,这些元素在逻辑上也是"对象状态的一部分"。因此,vector::operator[]具有返回const T&而不是T&的const超载,insert成员函数是非CONST,等等。

取决于程序员,定义'const'对类意味着什么。使用指定符mutable,您甚至可以拥有一个const对象,其中成员中的值更改。当涉及硬件时,人们可能会将配置视为const正确性的目标:只要配置不更改对象,就可以将对象视为恒定。

如果您对类中的其他对象有指示,则类似的问题会上升:然后,您的const方法可以在另一个对象上调用非const方法,从而修改它。

如果将硬件视为类引用的其他对象,则修改固件设置是完全有效的(因为只有"引用"对象被更改)。如果您希望您的课程"表示"硬件(或一部分),我宁愿不要将方法标记为const

所以我认为这主要取决于您如何设计课程。

有两种看待此方法的方法 - 优化角度和该声明的逻辑。更重要的是您决定。

优化

编辑:我做了一些错误的假设。似乎编译器实际上并不能自由进行以下优化,并且只能通过分析该方法的 hody 来确保不会发生任何修改(甚至在简单的情况下)。P>

拥有此const将允许编译器优化一点 更多的。它知道regWrite不会更改 对象,因此,如果将它们存储在寄存器中,并且可以使它们保持 进行类似的优化,以依靠对象字段不存在 更改。

这确实是编译器何时依赖的唯一一件事 进行这样的定义,因此拥有此const是可以的,可以 理论上允许更好的性能。

使逻辑含义

拥有一种const方法,其整体目的是破坏性的变化,这是不直觉的。程序员的通常直觉是,只要我只调用const方法,其他const方法的结果就不应更改。如果您违反了这份不成文的合同,请期望人们会感到惊讶 - 即使编译器可以接受。

我不确定这是否会在这里违反 - 这将取决于此类中的其他代码。但是,如果没有其他考虑很重要(性能等),则const是(对我来说)主要是界面上的标记,它说"调用此对象不会改变此对象的状态",因为对"状态"的广泛定义。

这是模糊的立场,这取决于您认为国家的变化。如果您将固件对象视为将a 链接 ,则编写寄存器不会改变有关此 link 的任何内容,并且是const。如果您认为它代表了基础寄存器的状态,而不是写信给寄存器是一个变化。