C++ - 如何在成员函数内初始化静态变量?

q09*_*987 0 c++

void ClassA::Func()
{
    static map<int, string> mapIntStr;

    mapIntStr[0] = m_memberVariable0; <= just want to do once & m_memberVariable* are not static
    mapIntStr[1] = m_memberVariable1; <= just want to do once
    ...
}
Run Code Online (Sandbox Code Playgroud)

我只想初始化变量mapIntStr一次.我们知道,我们可以将初始化代码放在静态函数中并调用该静态函数并将返回值存储到mapIntStr中.

在这里,我想得到一个快速而肮脏的解决方案.我记得有一种叫做静态范围的东西.我想在不调用静态函数的情况下初始化mapIntStr ONCE.我该怎么做?

谢谢

Xeo*_*Xeo 6

void ClassA::Func()
{
    static map<int, string> mapIntStr;

    if(mapIntStr.empty()){
      mapIntStr[0] = m_memberVariable0;
      mapIntStr[1] = m_memberVariable1;
      // ...
    }
}
Run Code Online (Sandbox Code Playgroud)

那个怎么样?:)
编辑
嗯,最好的解决方案是mapIntStr取出功能并进入课堂.然后你不会绕过静态函数调用.

//in ClassA.h
class ClassA{
public:
  void Func();

  static map<int,string> InitStatic();
  static map<int,string> mapIntStr;
};

//in ClassA.cpp
#include "ClassA.h"
void ClassA::Func(){
  // use mapIntStr
}

map<int,string> ClassA::InitStatic(){
  map<int,string> ret;
  // init ret
  return ret;
}

map<int,string> ClassA::mapIntStr = ClassA::InitStatic();
Run Code Online (Sandbox Code Playgroud)

这是我所知道的唯一选择.所以你有了选择.在func中初始化一次映射,或者甚至在第一次ClassA创建对象时使用构造函数初始化映射(两者的更好版本)并且接受几乎没有调用的开销empty(),这很可能只是在正确的内联之后才是单个指令并且不会产生任何开销,或者使用静态初始化函数.

  • @ q0987:你似乎没有意识到几个CPU周期有多小. (6认同)