constexpr const char * в заголовочном файле - PullRequest
0 голосов
/ 26 февраля 2019

Есть ли причина не использовать «constexpr const char *» в заголовочном файле?

Аргумент коллеги состоит в том, что каждая единица перевода, включая этот заголовочный файл, будет иметь копию.

Насколько я понимаю, так как его постоянная времени компиляции, память не выделяется и действует больше как макрос "#define" в отношении использования памяти.Вот источник,

TestConstExpr.h

  #include <string.h>
  namespace TestConstExpr
  {
    constexpr const char* TIME_FORMAT = "yyyy-MM-dd hh:mm:ss";
    constexpr const int TIME_FORMAT_SIZE = strlen(TIME_FORMAT) + 1;

    class TestClass
    {
        char arr[TIME_FORMAT_SIZE];
    }
  }

1 Ответ

0 голосов
/ 26 февраля 2019

Аргумент коллеги состоит в том, что каждая единица перевода, включая этот заголовочный файл, будет иметь копию.

Вы, коллега, технически правы.Но это не имеет значения, так как избыточные копии выбрасываются, когда блоки связаны друг с другом.

Хотя я видел комментарии о том, что это не всегда так в некоторых нестандартных системах, когдазадействовано динамическое связывание.


constexpr const char* TIME_FORMAT = "yyyy-MM-dd hh:mm:ss";
.... sizeof(TIME_FORMAT)

Это не то, что вы, вероятно, думаете.Он дает вам размер указателя, а не размер указанной строки.

constexpr const int TIME_FORMAT_SIZE = strlen(TIME_FORMAT) + 1;

Ваша попытка исправления также не работает, поскольку strlen не является константным выражением.

Вы можете исправить проблемы, используя ссылку на строковый литерал:

static constexpr auto& TIME_FORMAT = "yyyy-MM-dd hh:mm:ss";
constexpr const int TIME_FORMAT_SIZE = sizeof(TIME_FORMAT);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...