假设我有一个用于存储一些数据的简单 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::map
或 std::unordered_map
)对性能的影响更大,方式您传递参数,以及如何使用(或避免)动态内存管理。
您可能需要考虑的其他事项是:
- 保护您的经理免受多线程访问以及与之相关的性能问题的影响;
- 如果您构造一个具有重名的类,请定义您的程序的行为;
- 正确遵循Rule of Three (or Five) ;
- 避免 Static Initialization Order Fiasco ,关于您在
MyClass
中的静态成员; - 如果
MyClassMgmt
确实是单例,则使其遵循正确的单例模式; - 如果您不想修改或复制参数,则通过const-reference 传递参数;
- 如果您已将拷贝确定为瓶颈,则在适当的时候使用移动语义;
- 如果您已将分配确定为瓶颈,请使用内存池;
- 在进行过早优化之前实际分析您的代码。
关于c++ - 如果我们将静态数据混合到实例类中,性能会受到影响吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44036353/