C++ C++;互斥和常量正确性
对于本质上是只读的,但具有可能需要修改的互斥/锁的方法是否为常量,是否有约定 如果没有,如果这种方法是C++ C++;互斥和常量正确性,c++,C++,对于本质上是只读的,但具有可能需要修改的互斥/锁的方法是否为常量,是否有约定 如果没有,如果这种方法是const 谢谢您可以使用关键字可变标记数据成员,以允许在常量成员函数中修改它们,例如: struct foo { mutable mutex foo_mutex; // .... void bar() const { auto_locker lock(foo_mutex); // ... } }; 尽量少这样做,因为滥
const
谢谢您可以使用关键字
可变
标记数据成员,以允许在常量成员函数中修改它们,例如:
struct foo
{
mutable mutex foo_mutex;
// ....
void bar() const
{
auto_locker lock(foo_mutex);
// ...
}
};
尽量少这样做,因为滥用
mutable
是邪恶的。对于概念上为const
的方法,我通常可以使用mutable
锁和缓存
特别是在缓存性能计算结果的情况下。这是一个严格意义上的实现细节,调用者不应该关心它,因此删除const
指定就相当于抽象中的一个小漏洞
对于锁,我会问自己,锁是否只是一个私有的实现细节。如果锁与其他对象共享,那么它实际上是接口的一部分
在某些平台上,锁是通过句柄访问的,因此您可以在方法上使用
const
,而不用担心mutable
谢谢。我想问题其实是关于设计,而不是如何实现AAA@将互斥数据成员标记为可变是一种可接受的用例,因为它不代表对象的真实状态。在我们的产品中,这个关键字使用了三次,其中一次正好是可变boost::mutex
。总有一天我会想办法摆脱另外两个。谢谢,这也是我的印象,但我不确定这是否合理design@aaa在我们的代码库中,我们还将mutable用于互斥数据成员,另一个可接受的用例是引用计数对象,我指的是实际的引用计数成员。另一种可接受的用例是使用“is_dirty”标志惰性地评估对象。我认为这取决于类的语义:在不同的情况下,不同的方法可能是有意义的。为什么你不想让它保持常量?@Neil我觉得应该避免可变,但看起来互斥是一个很好的选择,所以我想听听它是否合适design@aaa我经常在自己的代码中使用mutable,因此它有我的认可印章,因为它的价值:-)@aaa:我认为决定mutable
是否可以使用的关键问题是:“这段数据是否表示用户可以看到对象的状态?”如果您回答“是的,它可以”,那么将其设置为mutable
将滥用mutable
。如果您回答“否,它不可以”,则mutable
可能是可以接受的。