Буфер [index] занимает столько же циклов, сколько * buffer?

char buffer[424242] = {0};

Является buffer[index] так быстро как *buffer?

for (int i = 0; i < SIZE; ++i) {
buffer[i] = 42;
}

char* end = buffer + SIZE;
for (char* pos = buffer; pos != end; ++pos) {
*pos = 42;
}

Я предполагаю, что мой вопрос заключается в том, есть ли какая-либо инструкция по сборке, которая может установить позицию в памяти плюс и сместить на заданное значение в одном цикле?

LEA, кажется, загружает адрес и умножает его таким образом.

-1

Решение

*buffer по крайней мере так же быстро, как buffer[index], Зависит от index, Если index == 0, они будут одинаково быстры

Согласно вашему редактированию:

char& end = buffer + SIZE;
for (char* pos; pos != end; ++pos) {
*pos = 42;
}

вызывает неопределенное поведение, потому что вы не инициализируете pos,

Согласно вашему второму редактированию:

Сначала напишите свой код для удобства чтения, профиль & возможно, изменится только после того, как у вас есть конкретные результаты.

for (int i = 0; i < SIZE; ++i) {
buffer[i] = 42;
}

это более читабельно, придерживайтесь его.

1

Другие решения

Не уверен, что это ответ, который вы ожидаете, но есть ли у вас проблемы с производительностью, чтобы решить?

Ваш список тегов вопросов содержит «оптимизацию»: я был бы очень удивлен, если бы единственной доступной оптимизацией в вашем коде был выбор между написанием *buffer или же buffer[],

Если у вас действительно есть проблема с производительностью, вы должны сначала профилировать свой код, чтобы выяснить, что является узким местом.

1

По вопросам рекламы [email protected]