Я пытаюсь немного оптимизировать свой код и обнаружил, что мое использование QRegExp
не связано с какими-либо неконстантными методами:
Код, который у меня есть:
QString parse(const QString &data) {
static const QRegExp DATA_REGEXP(QStringLiteral("^(\\w{4}) (\\w{4}) SN=(\\w*)"));
if (DATA_REGEXP.indexIn(data) != -1) {
const QString vendorId = DATA_REGEXP.cap(1);
const QString modelId = DATA_REGEXP.cap(2);
const QString serial = DATA_REGEXP.cap(3);
// ...
}
// ...
}
Я подумал, как это возможно (имея const
-методы, которые фактически меняют объект), просмотрел код и обнаружил, что, хотя методы объявлены как const
, они работают внутри изменяемого (не путайте с ключевым словом mutable
) внутреннего объекта внутри (Qt использует идиому PIMPL). Итак, теперь я задаюсь вопросом, безопасно ли вызывать indexIn
и cap
для этого static const QRegExp
объекта или нет? Эти методы, кажется, не являются реентерабельными, поскольку их использование из нескольких потоков приведет к изменению общей памяти, поэтому я думаю, что мне нужно использовать примитивы синхронизации, это правильно?