Lite_stream
@Lite_stream

Является ли одинаковой скорость 2-х фрагментов кода (доступ к элементу массива по индексу)?

Дан код(удалены неотносящиеся к контексту участки кода):

template <typename T>
class BinaryHeap
{
    std::byte * buffer;

   void siftDown(size_t position)
  {
     // First snippet
        if (reinterpret_cast<T *>(buffer[position * sizeof(T)]) > reinterpret_cast<T *>(buffer[indexOfMin]))
        {

        }
      // ...

    // Second snippet: without template, now buffer is int * not sts::byte
        if (buffer[position] > buffer[indexOfMin])
        {

        }
  }
}


Правильно ли я понимаю, что скорость обоих участков кода (если в качестве T был бы int), будет одинаковой, так как position * sizeof(T) для byte - смещения в байтах относительно начала buffer, а просто position развернётся в position * sizeof(int) (как смещение) и операция умножения будет присутствовать в обоих примерах ?
  • Вопрос задан
  • 94 просмотра
Решения вопроса 1
gbg
@gbg Куратор тега C++
Любые ответы на любые вопросы
Из общих соображений - да, умножение нужно и там и там. Однако! Представленный код является шаблоном, следовательно, будет инлайнится по месту. Следовательно - нужно смотреть конкретный код, который вызывает этот метод - может оказаться так, что компилятор сможет выкинуть умножение совсем - например, если обращение происходит в цикле - можно ведь шагать сразу на размер инта.

В любом случае, такой уровень экономии на спичках имеет реальную ценность только после того, как все остальные способы оптимизации программы уже выполнены, потому что это недалеко от реализации на ассемблере и интринсинках.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы