Предположим, у меня есть следующий пример кода только для того, чтобы создать метод вставки 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
.