c++ - 如果我们将静态数据混合到实例类中,性能会受到影响吗?

标签 c++

假设我有一个用于存储一些数据的简单 C++ 类:

class MyClass
{
    std::string Name;
    int Data = 0;

    MyClass(std::string n, int d) : Name(n), Data(d)
    { }
};

现在我想要某种管理类,它存储实例到 MyClass 的映射。我想稍后在运行时使用第二个类来访问这些实例。

class MyClassMgmt
{
    std::map<std::string, MyClass*> Mapping;

    MyClassMgmt()
    { }

    void AddMyClass(MyClass* MyCls)
    {
        Mapping[MyCls->Name] = MyCls;
    }

    MyClass* GetMyClass(const std::string& Name) const
    {
        return Mapping.at(Name);
    }
};

我的问题是:如果我在静态成员的帮助下直接使用 MyClass 来实现此管理功能,那么这会对整体性能产生负面影响吗?或者这种方法还有其他缺点吗?

像这样:

class MyClass
{
    std::string Name;
    int Data = 0;

    static std::map<std::string, MyClass*> Mapping;

    MyClass(std::string n, int d) : Name(n), Data(d)
    { }

    static void AddMyClass(MyClass* MyCls)
    {
        Mapping[MyCls->Name] = MyCls;
    }

    static MyClass* GetMyClass(const std::string& Name) const
    {
        return Mapping.at(Name);
    }
};

最佳答案

您不会看到与使用静态相关的性能问题。

您选择的容器(例如 std::mapstd::unordered_map)对性能的影响更大,方式您传递参数,以及如何使用(或避免)动态内存管理。

您可能需要考虑的其他事项是:

  • 保护您的经理免受多线程访问以及与之相关的性能问题的影响;
  • 如果您构造一个具有重名的类,请定义您的程序的行为;
  • 正确遵循Rule of Three (or Five) ;
  • 避免 Static Initialization Order Fiasco ,关于您在 MyClass 中的静态成员;
  • 如果 MyClassMgmt 确实是单例,则使其遵循正确的单例模式;
  • 如果您不想修改或复制参数,则通过const-reference 传递参数;
  • 如果您已将拷贝确定为瓶颈,则在适当的时候使用移动语义
  • 如果您已将分配确定为瓶颈,请使用内存池
  • 在进行过早优化之前实际分析您的代码。

关于c++ - 如果我们将静态数据混合到实例类中,性能会受到影响吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44036353/

相关文章:

C++ 元模板 : A Good or Bad Design Choice?

c++ - 在 Netbeans 中调试基于 CMake 的应用程序

c++ - 使用 itoa() 的最佳实践是什么

c++ - 如何将数学矩阵转换为 Direct3D 矩阵?

c++ - 如何将 const char* 转换为字符串,然后再转换回 char*?

c++ - C++/Qt 应用程序中没有 R 的 MonetDBLite

c++ - 如何检测一个成员函数是否具有特定的功能,接受特定的参数?

c++ - 在 Visual Studio 2008 中链接 libav 库

c++ - dyld : Library not loaded: @rpath/libeng. 动态库

c++ - 非主线程中的QApplication