Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为了速度牺牲常量正确性可以吗?_C++_Oop_Optimization_Constants - Fatal编程技术网

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
函数。