是否可以牺牲const-correctness的速度?

时间:2012-09-02 19:01:49

标签: c++ oop optimization const

我有一个工厂类,用于创建某个类的大量实例。创建过程非常模糊,可能需要很长时间。所以我认为存储已经在工厂内创建的类的实例是明智的,我可以在以后回忆它们。

创建取决于单个参数(名称),因此可以将内容存储在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 - 函数来解决这个微不足道的事情。 这些牺牲是否符合逻辑?

如果这个问题过于依赖品味,请不要开枪。

2 个答案:

答案 0 :(得分:3)

这是使用mutable的典型示例。只要外部行为真的是const,就应该这样做。

答案 1 :(得分:0)

由您决定 - 如果您认为old_instances的状态不会对您的类的客户端代码产生任何可观察/概念上的差异,那么您可以使其变为可变,并使工厂函数为const。但是你应该确保它是真的,否则你只会让自己或其他人在以后阅读你的代码时感到困惑。