Вопрос про строки и массивы в C++.

программирование оптимизация С++ массивы строки

В C++ выполняется два действия: массив из 16 элементов сравнивается с массивом [1,2,3... и т д до 16] (всё совпадает или не всё) и строка длины 16 сравнивается со строкой "123456789abcdef0" (тоже проверка на "одинаковость"). Что выполнится быстрее?
Строка же по сути тоже массив, значит... одинаково?

это я пытаюсь оптимизировать "пятнашки", кто не понял)

Примечание:
Просто я делаю проект, а поскольку механика игры совсем простая, то мне надо хотя-бы в оптимизации сумничать, иначе уж совсем слабенько получается)
Ответы:
Профайлер в помощь
одинаково, массивы не такие большие чтобы видеть различие. Имею в виду оба масива спокойна залезут в кеш процессора.
Оптимизировать такой легкий код - задача, скорее, теоретическая.. Ну, давайте, потеоретизируем!
Сравнение строк предполагает вызов стандартной библиотечной функции? Если да, то имейте ввиду, что накладные расходы на вызовы весьма велики. Если нет, то у вас в руках все тот же массив.
Что до попарного сравнения элементов двух маленьких (и немаленьких тоже) массивов, то можно попробовать сравнивать более крупными "фракциями" - архитектура, скорее всего, позволяет! Так как диапазон значений элементов массива у вас небольшой, то он вполне влезает в байт (влезет он и в пол-байта, но работать с таким массивом поэлементно накладно из-за битовых операций). Таким образом, вы запросто можете интерпретировать этот массив как массив типа long long длины 2 (это все те же 16 байт исходного массива) и сделать всего 2 сравнения вместо 16.
Да пофигу, оба варианта при правильном подходе соптимизируются до какого-нибудь repz cmpsb. А вообще-то ты впадаешь во грех преждевременной оптимизации.
а что мешает из массива с 16-ю элементами (если это char) сделать массив из 4-х элементов? или вообще из 2-х если у вас 64 бита ?
например есть массив
char arr0 = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
далее делаем финт ушами :
int arr1 = arr0;
Что arr0 что arr1 и то и другое - 4-х байтовый указатель. тип в описании массива влиет только на то сколько должно читаться байт при операциях с массивом. То бишь мы получаем в arr1 тот же указатель, но работать теперь будем с 4-х байтовыми числами. То бишь компилятор заюзает 32-х битные операции и проведёт 4 сравнения, что будет быстрее чем сравнить 16 байт побайтно. Ну или вообще извратитесь с ассемблерной вставкой, и 64-х битными командами.
Ассемблером я владею слабо, по-этому уточните как правильно адресацию применить, но выглядеть это примерно так будет :
char arr0[16]; // 1-й массив для проверки
char arr1[16]; // 2-й массив для проверки
char eq = 0;
asm {
xor cx, cx
mov rax, [&arr0]
mov rbx, [&arr1]
> Строка же по сути тоже массив, значит... одинаково
В общем-то да. O(n)


15 лет назад

RPI.su - самая большая русскоязычная база вопросов и ответов. Наш проект был реализован как продолжение популярного сервиса otvety.google.ru, который был закрыт и удален 30 апреля 2015 года. Мы решили воскресить полезный сервис Ответы Гугл, чтобы любой человек смог публично узнать ответ на свой вопрос у интернет сообщества.

Все вопросы, добавленные на сайт ответов Google, мы скопировали и сохранили здесь. Имена старых пользователей также отображены в том виде, в котором они существовали ранее. Только нужно заново пройти регистрацию, чтобы иметь возможность задавать вопросы, или отвечать другим.

Чтобы связаться с нами по любому вопросу О САЙТЕ (реклама, сотрудничество, отзыв о сервисе), пишите на почту [email protected]. Только все общие вопросы размещайте на сайте, на них ответ по почте не предоставляется.