Варианты уменьшения количества экземпляров шаблона для std :: vector тривиального типа - PullRequest
3 голосов
/ 31 мая 2019

Предположим, у меня есть следующий пример кода только для того, чтобы создать метод вставки std::vector как минимум для двух тривиальных типов:

#include <vector>

void insert(std::vector<int>& v, int const* a, int const* b)
    { v.insert(v.end(), a, b); }

void insert(std::vector<short>& v, short const* a, short const* b)
    { v.insert(v.end(), a, b); }

Если вы скомпилируете этот код, вы получите почти идентичные копиитот же код (см. https://gcc.godbolt.org/z/jsQBCn). Возможно ли добиться более компактного кода без использования собственного специализированного std :: vector, который предполагает, что T тривиален, так что в истинной реализации можно бросить путь типу, поэтомутяжелая работа может быть реализована с использованием memcpy и realloc напрямую. Я полагаю, что это стандартное решение - UB.

Например, компилятор не объединил два экземпляра uninitialized_copy.Я понимаю, что нельзя сопоставлять два разных символа одному и тому же адресу, но не смог по крайней мере заменить вторую копию переходом к первому. Этого даже не происходит с -Os.

...