【发布时间】:2019-01-10 10:53:32
【问题描述】:
例如我有这样的代码:
void func(const QString& str)
{
QString s = str.replace(QRegexp("[abc]+"), " ");
......
}
编译器是否会优化 var QRegep("[abc]+"),只构造一次而不是每次调用 func 时构造?或者换句话说,我是否需要像这样重新实现性能编码:
void func(const QString& str)
{
static const QRegexp sc_re("[abc]+");
QString s = str.replace(sc_re, " ");
......
}
将 QRegexp 设为静态 const 变量。
【问题讨论】:
-
我看不出编译器如何优化它以只构造一次
QRegexp,因为它不知道构造函数可能有什么副作用。但是,您可以随时检查生成的 asm 以供自己查看 - Compiler Explorer 对此非常棒。 -
"..我是否需要像这样重新实现性能编码:"..无论您问题第一部分的答案是什么,这部分的答案都是明确的。不要做过早的优化,为了清晰和可读性而编写代码,然后才测量和分析(我非常怀疑你的分析器会将该行识别为热点)
-
你希望调用这个数百万次吗?如果是,您可能想要优化,如果不是,您可能不想优化。
-
@JesperJuhl 如果编译器也在编译 QRegep,那么理论上它可以确定副作用(现代编译器在他们的工作中确实令人惊叹)。不是说这种情况会,但不是不可能想象它可以
-
他们可能会在编译时进行一些计算,但我不知道有一个编译器会自动按照您的建议进行缓存。
标签: c++ gcc optimization