Адрес постоянных строк

или поместите все в файл jar и добавьте его в качестве внешнего jar.

6
задан big-z 23 October 2009 в 06:32
поделиться

6 ответов

Конечно, нет никаких гарантий, но это обычная (я думаю) оптимизация.

Стандарт C ++ говорит (2.13.4 / 2 "Строковые литералы):

Все ли строки разные литералы (то есть хранятся в неперекрывающихся объектах) определяется реализацией.

Чтобы было ясно, вы не должны писать код, предполагающий, что эта оптимизация будет иметь место - как говорит Крис Лутц, код C ++, который полагается на это это код, который ждет своего взлома.

11
ответ дан 8 December 2019 в 04:09
поделиться

это называется интернированием строк

В вашем случае лучше не полагаться на это. Возможности разные, но я не очень компетентен в этом вопросе

8
ответ дан 8 December 2019 в 04:09
поделиться

GCC использует такую ​​оптимизацию, и Microsoft использует (они называют это пулом строк ). Это просто оптимизация, стандарт C ++ прямо заявляет, что вы не можете ее использовать (в 2.13.4 / 2). Вдобавок представьте себе, что вы получите указатель на строку из какого-то другого модуля / библиотеки - я не думаю, что компилятор может сделать такую ​​оптимизацию в этом случае.

3
ответ дан 8 December 2019 в 04:09
поделиться

Такой гарантии нет. Язык просто говорит, что они могут иметь один и тот же адрес. Или нет.

2
ответ дан 8 December 2019 в 04:09
поделиться

На самом деле есть решение, такое простое решение:

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, чтобы передать свой смысл, и это ОК для сравнения адреса памяти :)

Некоторые внешние элементы могут отсутствовать ... У меня проблемы с этим чудовищем

0
ответ дан 8 December 2019 в 04:09
поделиться

Есть ли гарантия, что у них одинаковый адрес, т.е. могу ли я написать следующий код?

Стандарт допускает такую ​​оптимизацию, поскольку строковые литералы доступны только для чтения.

Я слышал, что GNU C ++ оптимизирует строки таким образом, чтобы они имели одинаковый адрес, могу ли я использовать эту функцию в своих программах?

Да, GCC / G ++ часто так делают. AFAIK, есть возможность включить / выключить это.

2
ответ дан 8 December 2019 в 04:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: