这个Github存储库添加了std::regex到正则表达式引擎列表中,并被其他引擎抽取。
为什么std::regex --就像在libstdc++中实现的那样--要比其他的慢得多?是因为C++标准需求,还是因为特定的实现没有得到很好的优化?
同样在射击中,std::regex无法编译所有其他人都接受的几个正则表达式,即使在添加标志std::regex::Extended后也是如此。他们是(?i)Twain
,\b\w+nn\b
,(?i)Tom|Sawyer|Huckleberry|Finn
,\s[a-zA-Z]{0,12}ing\s
,([A-Za-z]awyer|[A-Za-z]inn)\s
和\p{Sm}
。
更新:添加了与boost::regex的比较。
UPDATE2:添加了ctre
发布于 2022-01-05 04:11:05
是因为C++标准需求,还是因为特定的实现没有得到很好的优化?
答案是肯定的。差不多吧。
毫无疑问,libstdc++的<regex>
实现没有得到很好的优化,但更重要的是,并不是标准需求抑制优化,而是标准需求抑制更改。
regex库是通过一堆模板定义的。这允许人们在char
和wchar_t
之间进行选择,这在理论上是很好的。但有个陷阱。
模板库通过直接将代码复制和粘贴到针对这些库进行编译的代码中使用。由于模板是如何包含的,即使模板库之外没有人知道的类型实际上也是库的ABI的一部分。如果更改它们,则针对标准库的不同版本编译的两个库不能相互操作。因为regex的模板参数是它的字符类型,这些实现细节基本上涉及到实现的所有内容。
当libstdc++ (和其他标准库实现)开始交付C++正则表达式的实现时,它们将自己绑定到不能以影响库的ABI的方式更改的特定实现。虽然它们可能会导致另一个ABI中断来修复它,但是标准库实现者不喜欢破坏ABI,因为人们不会升级到破坏代码的标准库。
当C++11禁止basic_string
的写拷贝实现时,libstdc++遇到了ABI问题.他们的母牛字符串被广泛使用,而更改它将使编译新字符串的代码与针对旧字符串编译的代码一起使用。libstdc++花了多年的时间才真正实现了C++11字符串。
如果Regex是在没有模板的情况下定义的,那么实现可以使用传统的机制来隐藏实现细节。外部代码接口的ABI可以是固定的和不变的,只有ABI后面的函数的实现才能从一个版本更改到另一个版本。
https://stackoverflow.com/questions/70583395
复制相似问题