为了速度牺牲常量正确性可以吗
is it okay to sacrifice const-correctness for speed?
我有一个工厂类,它将用于创建某个类的大量实例。创建过程相当混乱,可能需要相当长的时间。所以我认为将已经在工厂中创建的类的实例存储起来是明智的,我可以稍后回忆它们。
创建依赖于一个参数(名称),因此可以将内容存储在std::map
中,我称之为old_instances
。
A A_factory::make_A(std::string const& name)
{
if ( old_instances.find(name) != old_instances.end() )
{
return old_instances.find(name) -> second;
}
else
{
// obfuscated creation process that creates instance 'new_A'
// ...
old_instances.insert(std::pair<std::string, A>(name, new_A)); // <- problem
return new_A;
}
}
这里的问题是,整个例程可能是工厂的const
成员。但因为old_instances
是自适应的。
为了这么琐碎的事情而牺牲函数的const
性,我觉得有点尴尬。这些牺牲合乎逻辑吗?
如果这个问题过于依赖品味,请不要向我开枪。
这是使用mutable
的经典示例。只要外部行为确实是const的行为,那么这样做应该很好。
这取决于您-如果您认为old_instances的状态对类的客户端代码没有任何可观察到的/概念上的差异,那么您可以使其可变,并使工厂函数常量。但你真的应该确保这是真的,否则你只会混淆自己或其他人稍后阅读你的代码。
相关文章:
- 代理对象的常量正确性
- std::函数常量正确性未遵循
- C++ 常量正确性/缺少支持常量和非常量实例的类的常量构造函数
- 自定义引用包装器的常量正确性
- 如果我公开常量和非常量 API,我是否破坏了常量正确性?
- 如何强制实施有关指针数据成员的常量正确性
- 如何在C++的多维地图中实现常量正确性
- 将函数赋值给函数指针,常量参数正确性
- C++ 函数参数或声明中的常量正确性
- 结构初始化中的常量正确性
- 常量正确性编译错误到模板函数中的无效转换错误
- 如何在不违反常量正确性的情况下使用 std::lock_guard
- 非平凡变量的常量正确性
- 常量正确性和成员参考
- 常量正确性和shared_ptr,一个设计问题
- 观察者常量正确性
- 如何跨指针保持常量正确性
- 为了速度牺牲常量正确性可以吗
- file read()常量正确性
- C++NULL指针和常量正确性