将 std::regex 设为静态是个好主意吗?

val*_*ica 5 c++ regex static

我使用std::regex从字符串文字创建的内容,如下所示:

std::regex vowel_re("a|e|i|o|u");
Run Code Online (Sandbox Code Playgroud)

static为了节省施工时间甚至是这样做是个好主意吗static const?这个正则表达式很可能会被重用。

Tob*_*obi 6

如果块作用域变量的构造时间是一个问题,那么将其设为static或是一个快速但肮脏的解决方案static const。因此,该变量仅初始化一次,从而节省了构造时间。

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

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

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

编辑:

对于这种非常特殊的情况,我怀疑您也可以使用find_first_of("aeiou")方法(或者如果您在任意字符范围上搜索,则使用std::basic_string算法)。std::find_first_of把事情简单化!