или поместите все в файл jar и добавьте его в качестве внешнего jar.
Конечно, нет никаких гарантий, но это обычная (я думаю) оптимизация.
Стандарт C ++ говорит (2.13.4 / 2 "Строковые литералы):
Все ли строки разные литералы (то есть хранятся в неперекрывающихся объектах) определяется реализацией.
Чтобы было ясно, вы не должны писать код, предполагающий, что эта оптимизация будет иметь место - как говорит Крис Лутц, код C ++, который полагается на это это код, который ждет своего взлома.
это называется интернированием строк
В вашем случае лучше не полагаться на это. Возможности разные, но я не очень компетентен в этом вопросе
GCC использует такую оптимизацию, и Microsoft использует (они называют это пулом строк ). Это просто оптимизация, стандарт C ++ прямо заявляет, что вы не можете ее использовать (в 2.13.4 / 2). Вдобавок представьте себе, что вы получите указатель на строку из какого-то другого модуля / библиотеки - я не думаю, что компилятор может сделать такую оптимизацию в этом случае.
Такой гарантии нет. Язык просто говорит, что они могут иметь один и тот же адрес. Или нет.
На самом деле есть решение, такое простое решение:
char const * const Message_Ok = "OK";
char const * const OK() { return Message_Ok; }
int main(int argc, const char* argv[])
{
if (OK() == Message_Ok) { std::cout << "OK" << std::endl; }
return 0;
}
Вы не можете сравнивать два разных строковых литерала, но используйте глобальную переменную const, чтобы передать свой смысл, и это ОК
для сравнения адреса памяти :)
Некоторые внешние элементы могут отсутствовать ... У меня проблемы с этим чудовищем
Есть ли гарантия, что у них одинаковый адрес, т.е. могу ли я написать следующий код?
Стандарт допускает такую оптимизацию, поскольку строковые литералы доступны только для чтения.
Я слышал, что GNU C ++ оптимизирует строки таким образом, чтобы они имели одинаковый адрес, могу ли я использовать эту функцию в своих программах?
Да, GCC / G ++ часто так делают. AFAIK, есть возможность включить / выключить это.