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

StackOverflow https://stackoverflow.com//questions/25009061

Вопрос

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

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

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

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

Стоит ли мне беспокоиться об этом для параметров шаблона, не являющихся типами, в целом?

Это было полезно?

Решение

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

Более того, ты не платишь за то, чем не пользуешься поскольку неиспользуемые невиртуальные функции-члены (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]

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top