Возвращаемое значение c const - PullRequest
1 голос
/ 11 марта 2020

Является ли объявление массива stati c const внутри функции получения разумным способом сохранения целостности кода? Я никогда не видел этого раньше, но в обзоре кода я нашел что-то вроде этого:

static const std::array<std::string, 4>& fooArrayGetter()
{
  static const std::array<std::string, 4> fooArray =
    {"foo" ,"bar", "baz", "qux"};
  return fooArray;
}

Это выглядит правильно: массив выделяется только один раз, довольно элегантно, потому что getter объединяется со своим значением, но запускает его внутри Godbolt https://godbolt.org/z/K8Wv94 дает действительно грязный ассемблер по сравнению с выполнением всей операции более стандартным способом. В качестве мотивации для этого кода я получил ссылку на пункт 4 от Мейерса «Эффективный C ++

* 1008» * Редактировать: G CC компилятор с флагом --std = c ++ 11

Ответы [ 2 ]

4 голосов
/ 11 марта 2020

Является ли объявление массива stati c const внутри функции получения разумным способом сохранения целостности кода?

Это может быть. Это также может быть излишне сложно, если вам это не нужно. То, есть ли лучшая альтернатива, зависит от того, что вы собираетесь с ней делать.

дает действительно грязный ассемблер

Беспорядок неоптимизированной сборки редко имеет значение.

3 голосов
/ 11 марта 2020

Предупреждение * Ключевое слово

static здесь имеет два разных значения!

  • То, что вы примените к возвращаемому значению, говорит: функция fooArrayGetter должна быть видна только в этом модуле перевода (только текущий исходный код может использовать эту функцию)! Это не влияет на тип возвращаемого значения!

  • это внутри функции говорит: переменная fooArray имеет время жизни как глобальная область (инициализируется при первом использовании fooArrayGetter и живет так же долго, как и приложение). Это static делает возврат константной ссылки безопасным делом, поскольку делает эту переменную / постоянную эфирную.

...