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

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

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

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

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

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


person frangio    schedule 29.07.2014    source источник
comment
в std::array не так много кода, который должен быть встроен. Я не понимаю, как это может сильно увеличить размер исполняемого файла.   -  person Bryan Chen    schedule 29.07.2014
comment
Можете ли вы опубликовать код, который создает исполняемый файл большего размера, когда вы использовали std::array?   -  person M.M    schedule 29.07.2014
comment
Он не будет генерировать ничего, кроме запрошенного вами хранилища, если вы также не запросите использование алгоритмов/членов, которые он предоставляет. В чем-то и суть; он предоставляет их, поэтому вам не нужно. Вы, безусловно, можете использовать его как плоский массив (что, в любом случае, именно так), хотя я вынужден понять, почему вы решили переоборудовать все колеса, которые он уже предоставляет вам. Что касается предложений, основанных на шаблонах, то, что вы не используете, не раздувается, поэтому мне нужно понять, где находится недостаток.   -  person WhozCraig    schedule 29.07.2014
comment
Мерить, мерить, мерить.   -  person Matthieu M.    schedule 29.07.2014


Ответы (1)


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

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

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

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

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

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

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

person TemplateRex    schedule 29.07.2014
comment
Хороший ответ ! У меня всегда были те же сомнения, что и у ОП для std::array. Также спасибо за ссылку. - person P0W; 29.07.2014
comment
Re: последнее предложение, не заморачивайтесь. Я попробовал это в 1999 году, и даже 15 лет назад не было заметной разницы. - person MSalters; 29.07.2014
comment
@MSalters tnx, в принципе согласен, но ничто не заменит измерения (весьма поучительно настроить тесты из цитируемого отчета, просто чтобы понять, как провести правильный тест) :-) - person TemplateRex; 29.07.2014