Просто дополнительный ответ для завершения остальных.
Строковый литерал не является const char *
.Причина в том, что const char *
может быть переназначен.В вашем случае это означает, что вы можете сделать CHAR_ARRAY = "foo";
.
Практически это означает, что компилятор не может оптимизировать столько же кода, который имеет дело с const char *
, сколько код, имеющий дело со строкой.литерал.
Чтобы решить эту проблему, вы можете использовать один из следующих способов:
const char *const CHAR_ARRAY = "...";
const char CHAR_ARRAY[] = "...";
Это должно гарантировать ту же производительность, что и строковый литерал.
Однако в вашем случае, поскольку вы объявили CHAR_ARRAY
как static
, это означает, что компилятор может видеть, только глядя на текущий исходный файл, если CHAR_ARRAY
можно переназначить.
На практике это означает, что, предполагаяоптимизация включена:
- для строкового литерала, a
const char *const
или const char[]
, будет сгенерирован тот же код сборки (A). - для нестатического
const char *
будет сгенерирован другой код сборки (B), возможно, медленнее, поскольку их является дополнительным косвенным указанием, и результат не может быть известен во время компиляции. - для
static const char *
, он будет использовать либо код сборки(A) или (B) в зависимости отКомпилятор может доказать или нет, что указатель может быть переназначен.Например, если вы добавите функцию void f() { CHAR_ARRAY = "foo"; }
в любое место вашего кода, вы запретите компилятору использовать сборку (A) и (B).