Из справки известно, что QStringLiteral размещает текст непосредственно в исполняемом файле в области только для чтения. Однако я не нашёл информации о том, что в случае использования одинаковых строк в разных местах кода проекта, эти строки будут храниться по уникальности значения. Или каждый экземпляр строки будет сохранён отдельно?
Допустим, имеется сетевой запрос к некоему внешнему ресурсу. Этот запрос имеет строковую команду, скажем, "https://ru.stackoverflow.com/". Также есть два класса: class A и class B. В обоих требуется выполнять указанный запрос:
class A {
void getSo() {
sendRequest(QStringLiteral("https://ru.stackoverflow.com/"));
// Далее выполняем что-то специфическое для класса A.
}
};
class B {
void getSo() {
sendRequest(QStringLiteral("https://ru.stackoverflow.com/"));
// Далее выполняем что-то специфическое для класса B.
}
};
Вопрос заключается в том, что именно попадёт в исполняемый файл: две строки с адресом запроса или одна? Или я неверно понимаю принцип работы указанного макроса?
Ответ
Стандартом не оговорено.
Зависит от компилятора и настроек. Например, в Visual C++ 2015 имеется опция (зависящая от использованных параметров оптимизации)
/GF включить объединение строк только для чтения
Так что эти литералы будут объединены. Но если скомпилировать без этого ключа или с с /GF-, то в exe'шнике каждая займет свое место (при отключенной оптимизации - включение оптимизации автоматически включает эту опцию).
Комментариев нет:
Отправить комментарий