代码之家  ›  专栏  ›  技术社区  ›  Valentin

constexpr类成员的利弊

  •  3
  • Valentin  · 技术社区  · 7 年前

    比较这两种方法:

    // MyClass.hpp
    class MyClass
    {
      static constexpr char* const FOO = "bar";
    };
    

    VS

    // MyClass.hpp
    class MyClass
    {
      static const char* const FOO;
    };
    
    // MyClass.cpp
    const char* const MyClass::FOO = "bar";
    

    哪个更好?我可以想象,在第二种情况下,“bar”字符串只分配一次,而在第一种情况下,它每.cpp(包括我的头)分配一次。我说的对吗?还有什么需要考虑的吗?

    1 回复  |  直到 7 年前
        1
  •  1
  •   super    7 年前

    第一个版本只有在 c++17 . 它之所以工作是因为所有静态成员变量都声明了 constexpr 含蓄地 inline .

    允许多个定义(在单独的编译单元中),但链接时只有1个。所以你的假设是 .cpp 文件不正确。

    哪一个更可取取决于。如果我知道我永远不会改变,或者很少改变,我会选择第一个选择。

    如果我需要改变它,它可能会导致 CPP 文件,即 #include 它必须重新编译,然后最好在 CPP 文件。