使std :: regex静态化是个好主意吗?

时间:2018-07-18 07:55:59

标签: c++ regex static

我使用std::regex,它是从这样的字符串文字创建的:

std::regex vowel_re("a|e|i|o|u");

将它设为static以节省构建时间甚至节省static const是个好主意吗?此正则表达式很可能会被重用。

1 个答案:

答案 0 :(得分:2)

如果一个大范围变量的构造时间是一个问题,那么将其设置为staticstatic const是一种快速的解决方案。因此,该变量仅初始化一次,从而节省了构建时间。

但是,这不是免费的。编译器必须生成防止多线程访问的保护(因此,如果两个不同的线程同时调用该函数“第一次”,则该变量不会初始化两次)。

要变通解决此新问题,您可以在函数之前将变量定义为匿名命名空间中的全局变量。因此,它将在启动时进行初始化(在调用main之前)。如果在其他全局变量的初始化中使用该函数,则仍必须注意初始化顺序失败

当然,最好的解决方案是使用在运行时根本不需要初始化的东西。不幸的是,std :: regex构造函数不是constexpr。但是您可以将boost.spirit用作std :: regex的替代方法,它可以解决您的问题,并在编译时尽可能地发挥作用。

编辑:

对于这种非常特殊的情况,我怀疑您也可以只使用find_first_of("aeiou")的{​​{1}}方法(如果在任意字符范围内进行搜索,也可以使用算法std::basic_string)。保持简单!