gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 01:40:07 27 4
gpt4 key购买 nike

假设我有一个用于存储一些数据的简单 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com