Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/3: Рейтинг темы: голосов - 3, средняя оценка - 5.00
11 / 11 / 8
Регистрация: 13.04.2015
Сообщений: 159

копирование строк, производительность

06.11.2016, 23:38. Показов 628. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
подскажи, как максимально быстро скопировать сроку
C++
1
memcpy
или
я написал свою функцию
C++
1
2
3
size_t i = 0;
while (*(szReceiver + i) = *(szSource + i))
    i++;
как этот код преобразовать в ассемблерный для оптимизации?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
06.11.2016, 23:38
Ответы с готовыми решениями:

Используя функцию копирования строк, организуйте конкатенацію и копирование строк в четвертый массив, содержащий полные имена
Пожалуйста с этим заданием. Написать программу, которая описывает четыре массива. Три первых массива должны содержать имена, фамилии и...

Функции работы со строками символов: определение размера строки, копирование строк, добавление строк, сравнение строк
На языке Ассемблер написать функции работы со строками символов: определение размера строки, копирование строк, добавление строк, сравнение...

Влияние пустых строк на производительность
Увеличивают ли пустые строки в коде (делаю для лучшего восприятия) на производительность приложения? Перенесено из раздела C#

5
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
06.11.2016, 23:53
Цитата Сообщение от mxs89 Посмотреть сообщение
как этот код преобразовать в ассемблерный для оптимизации?
Никак. Ваша функция наглядно демонстрирует что ваш уровень знаний слишком низок, чтоб надеяться обставить компилятор по производительности.
PS
C++
1
while(*szReceiver++=*szSource++);
0
11 / 11 / 8
Регистрация: 13.04.2015
Сообщений: 159
06.11.2016, 23:55  [ТС]
ваш код быстрее?
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
07.11.2016, 00:07
Цитата Сообщение от mxs89 Посмотреть сообщение
ваш код быстрее?
Мой код использует более простую адресацию и не кушает лишний регистр процессора под индексную переменную. Да, в теории это должно дать прирост скорости. Как минимум за счет того, что освободившийся регистр можно занять под что-то полезное.
0
11 / 11 / 8
Регистрация: 13.04.2015
Сообщений: 159
07.11.2016, 00:14  [ТС]
я считаю для проверки количество символов, + мне удалось получить код на ассемблере
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
; Line 37
    push    ebp
    mov ebp, esp
    sub esp, 204                ; 000000ccH
    push    ebx
    push    esi
    push    edi
    lea edi, DWORD PTR [ebp-204]
    mov ecx, 51                 ; 00000033H
    mov eax, -858993460             ; ccccccccH
    rep stosd
; Line 38
    mov DWORD PTR _i$[ebp], 0
$LN2@Copy_:
; Line 40
    mov eax, DWORD PTR _szReceiver$[ebp]
    add eax, DWORD PTR _i$[ebp]
    mov ecx, DWORD PTR _szSource$[ebp]
    add ecx, DWORD PTR _i$[ebp]
    mov dl, BYTE PTR [ecx]
    mov BYTE PTR [eax], dl
    mov eax, DWORD PTR _szReceiver$[ebp]
    add eax, DWORD PTR _i$[ebp]
    movsx   ecx, BYTE PTR [eax]
    test    ecx, ecx
    je  SHORT $LN3@Copy_
; Line 41
    mov eax, DWORD PTR _i$[ebp]
    add eax, 1
    mov DWORD PTR _i$[ebp], eax
    jmp SHORT $LN2@Copy_
$LN3@Copy_:
; Line 43
    mov eax, DWORD PTR _i$[ebp]
; Line 44
    pop edi
    pop esi
    pop ebx
    mov esp, ebp
    pop ebp
    ret 0
Добавлено через 3 минуты
при использовании memspy идет вызов функции
Assembler
1
2
3
4
5
6
7
8
; Line 45
    push    12                  ; 0000000cH
    mov eax, DWORD PTR _szSource$[ebp]
    push    eax
    mov ecx, DWORD PTR _szReceiver$[ebp]
    push    ecx
    call    _memcpy
    add esp, 12                 ; 0000000cH
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12942 / 6809 / 1821
Регистрация: 18.10.2014
Сообщений: 17,234
07.11.2016, 00:34
Цитата Сообщение от mxs89 Посмотреть сообщение
memcpy
Каким образом вы обираетесь копировать строку при помощи memcpy??? Функция memcpy требует указания заранее известной длины копируемого блока памяти. В случае С-строк вам такая длина в общем случае заранее не известна.

Если же каким-то чудом вы знаете длину заранее, то да - скорее всего грамотно реализованная memcpy будет копировать быстрее всех.

Цитата Сообщение от Renji Посмотреть сообщение
Мой код использует более простую адресацию и не кушает лишний регистр процессора под индексную переменную. Да, в теории это должно дать прирост скорости. Как минимум за счет того, что освободившийся регистр можно занять под что-то полезное.
Никаких "регистров" ни один из этих вариантов не использует. Язык С++ ничего не знает ни о каких "регистрах процессора". При этом оба варианта кода настолько очевидно функционально эквивалентны, что любой уважающий себя компилятор соптимизирует их в один и тот же код. Разглагольстовать о какой-то сравнительной скорости работы этих вариантов - бессмысленное занятие.

---

Если бы кого-то интересовало быстрое копирование С-строк, то осмысленным вариантом было бы потребовать 1) выравнивания начала строк на границу машинного слова, 2) выравнивания длины буфера строк на границу машинного слова.

И после этого выполнять не побайтовое, а пословное копирование с использованием трюка типа

C
1
2
3
4
5
6
7
#define MASK1 0x0101010101010101
#define MASK2 0x8080808080808080
 
uint64_t w = /* очередное слово копируемого блока */;
uint64_t m = (w - MASK1) & ~w & MASK2;
if (m != 0)
  /* 'w' содержит нулевой байт */;
для отлова конца строки.
2
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
07.11.2016, 00:34
Помогаю со студенческими работами здесь

Копирование диапазона строк из одной книги в другую, при разном количестве строк
Добрый день ! Вопрос такой: есть две книги(например 7.1 и 7.2 ) с расшифровками счетов, счета идентичные , но информация о счетах разная. ...

Сравнение строк в нескольких файлах excel, копирование несовпадающих строк и их вывод в сводный файл
Добрый день, только только начал разбираться с VBA в excel, поэтому прошу помощи (схожие темы находил, но не смог преобразовать их...

Копирование строк
У Страуструпа приведен такой пример для копирования одной строки в другую: void cpy (char* p, const char* q) { while...

Копирование строк
Нужно сравнить две строки не учитывая пробелы. Ошибка где-то в копировании a1 в с1 #define _CRT_SECURE_NO_WARNINGS #include...

копирование строк
ребят, не подкажете как скопировать строку из искомой, начиная с символа а и заканчивая символом б? #include "stdafx.h" ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru