Использует ли std:: array <T, N> привести к раздуванию кода?

В нескольких местах я видел рекомендацию использовать std::array над массивами C-стиля на С++, утверждая, что это более безопасная альтернатива без накладных расходов. См:

Стандартный контейнерный массив [...] не имеет дополнительных накладных расходов он должен удерживать свои элементы [...]. Другими словами, это очень как встроенный массив без проблем. (С++ 11 FAQ)

Однако, насколько я понимаю, в качестве контейнера-шаблона будут накладные расходы по размеру программы, поскольку он будет генерировать код для каждого другого N, с которым создается массив.

Предположим, что моя программа использует std::array в разных местах с несколькими разными целыми числами для N, это приведет к раздутому коду? Это незначительно?

Должен ли я беспокоиться об этом для несимметричных параметров шаблона вообще?

Ответ 1

Я бы не стал беспокоиться об этом. Если вы посмотрите на интерфейс std::array<T, N>, он очень мал, и большинство функций-членов (в основном обеспечивающих оболочку для манипуляции с указателями) - это однострочные, которые будут полностью оптимизированы в любом приличном компиляторе на уровнях оптимизации режима выпуска.

Кроме того, вы не платите за то, что не используете, поскольку неиспользуемые не виртуальные функции-члены (std::array<T, N> делает не имеют функций-членов virtual) шаблонов классов, которые не могут быть созданы. Малая стандартная цитата:

14.7.1 Неявное создание экземпляра [temp.inst]

11 Реализация не должна неявно создавать функцию шаблон, шаблон переменной, шаблон-член, не виртуальный член функция, класс-член или статический член данных шаблона класса что не требует создания экземпляра. [...]

Есть также некоторые перегруженные реляционные операторы == и <, которые семантически эквивалентны std::equal и std::lexicographical_compare. На практике эти операторы также должны быть реализованы с точки зрения этих алгоритмов (жалуйтесь на своего поставщика, если они этого не делают).

Единственное маленькое беспокойство - небольшая лишняя накладная часть времени компиляции, но не должно быть нулевого размера кода и служебных программ.

Связанный, но не идентичный: Технический отчет по производительности С++ сделал много тщательных тестов на тонком классе обертки вокруг встроенных типов (int, double) и нашли близкие к нулю накладные расходы для технологии компилятора 2006 года. Вы можете повторить их тестирование, чтобы проверить это для std::array<T,N> vs. T[N]