Почему std :: vector и std :: string использует «для« цикла для копирования или перемещения элементов? Разве это не будет плохо для производительности? Разве это не было бы плохо для производительности по сравнению с обработкой с некоторыми более быстрыми функциями, в то время как элемент является основным типом, например, Memcpy и Memmove.
Вот код в std :: vector < /p>
LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR_SINCE_CXX20 char_type* copy(char_type* __s1, const char_type* __s2, size_t __n) {
if (!__libcpp_is_constant_evaluated()) {
_LIBCPP_ASSERT(__s2 < __s1 || __s2 >= __s1+__n, "char_traits::copy overlapped range");
}
char_type* __r = __s1;
for (; __n; --__n, ++__s1, ++__s2)
assign(*__s1, *__s2);
return __r;
}
< /code>
Я хочу знать, почему не внедрить специализированную версию вектор или строку, чтобы ускорить обработку. Яично, я думал, что компилятор оптимизирует эту часть кода, но это не так. Код: < /p>
void func(char *p1, char *p2, int len) {
memcpy(p1, p2, len);
}
void func(char *p1, char *p2, int len, int f) {
for (int i = 0; i < len; i++) {
p1 = p2;
}
}
< /code>
Результат заключается в следующем < /p>
//(memcpy) loop for 100000000000 times, cost time 305 us
//(for-loop) loop for 100000000000 times, cost time 1967 us
< /code>
Я использую Explorer компилятора, чтобы увидеть код разборки. Очевидно, компилятор не оптимизирует. Флаг компиляции "-os" распространен в проекте.
введите описание изображения здесь < /p>
Изменить: < /strong>
Я испытал повторный тест, используя char_traits :: copy. /> Я понял, спасибо, ребята. < /P>
Подробнее здесь: https://stackoverflow.com/questions/759 ... e-elements