C++ 为了速度牺牲常量正确性可以吗?
我有一个工厂类,它将用于创建某个类的大量实例。创建过程相当混乱,可能需要相当长的时间。因此,我认为存储工厂中已经创建的类的实例是明智的,我可以在以后调用它们 创建依赖于单个参数(名称),因此可以将内容存储在C++ 为了速度牺牲常量正确性可以吗?,c++,oop,optimization,constants,C++,Oop,Optimization,Constants,我有一个工厂类,它将用于创建某个类的大量实例。创建过程相当混乱,可能需要相当长的时间。因此,我认为存储工厂中已经创建的类的实例是明智的,我可以在以后调用它们 创建依赖于单个参数(名称),因此可以将内容存储在std::map中,我称之为old_实例 A A_factory::make_A(std::string const& name) { if ( old_instances.find(name) != old_instances.end() ) { re
std::map
中,我称之为old_实例
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;
}
}
A A_工厂::make_A(std::string const&name)
{
if(old_instances.find(name)!=old_instances.end())
{
返回旧的_实例。查找(名称)->second;
}
其他的
{
//创建实例“new_A”的模糊创建过程
// ...
旧的\u实例。插入(std::pair(名称,新的\u A))//这取决于您-如果您认为旧实例的状态对类的客户端代码没有任何可观察的/概念上的差异,那么您可以使其可变,并使工厂函数常量。但是您应该真正确保它是真的,否则您只会在以后阅读代码时混淆您自己或其他人。这不是真的这是使用mutable
的经典示例。只要外部行为确实是const的行为,您就可以这样做。看起来您正在重新创建自定义分配器或池存储。请参阅例如Boost Pool,顺便提一下,它被称为延迟加载,是另一种经常与工厂模式关联的设计模式。如果您如果你担心这些事情,你最好先担心insert
中不必要的副本!@Kerrek SB:告诉我,什么是更快的方法?@romeovs:正确获取映射的值类型!如果你不知道,请使用value\u-type
成员类型定义。如果你有C++11,最好使用emplace
函数。