Почему std :: vector и std :: string используют »для« цикла для копирования или перемещения элементов?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Почему std :: vector и std :: string используют »для« цикла для копирования или перемещения элементов?

Сообщение Anonymous »

Почему 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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»