Как использовать индексную последовательность для развертывания циклов?C++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Как использовать индексную последовательность для развертывания циклов?

Сообщение Anonymous »

Я пытаюсь максимально эффективно преобразовать беззнаковые целые данные в их двоичное представление в памяти.
Я написал четыре шаблонные функции для преобразования целых чисел как в прямой, так и в большой порядковый номер: два из них используют битовые операции, а два других используют указатели для копирования данных.
Они проверены на правильность, а также очень эффективны, поскольку я определил, что функции с прямым порядком байтов быть таким же быстрым, как std::memcpy, но функции с прямым порядком байтов почему-то занимают немного больше времени.
Эти функции:

Код: Выделить всё

#include 

using std::vector;
typedef vector bytes;

template
inline bytes LittleEndian(const T& data) {
size_t size = sizeof(T);
bytes _bytes(size);
uint8_t mask = 255;
for (size_t i = 0, shift = 0; i < size; i++, shift += 8) {
_bytes[i] = (data >> shift) & mask;
}
return _bytes;
}

template
inline bytes BigEndian(const T& data) {
size_t size = sizeof(T);
bytes _bytes(size);
uint8_t mask = 255;
for (size_t i = size, shift = 0; i-- > 0; shift += 8) {
_bytes[i] = (data >> shift) & mask;
}
return _bytes;
}

template
inline bytes CPU_Endian(const T& data) {
size_t size = sizeof(T);
bytes _bytes(size);
uint8_t* dst = (uint8_t *)_bytes.data(), * src = (uint8_t *) & data;
for (size_t i = 0; i < size; i++) {
*dst++ = *src++;
}
return _bytes;
}

template
inline bytes Flip_CPU_Endian(const T& data) {
size_t size = sizeof(T);
bytes _bytes(size);
uint8_t* dst = (uint8_t *)_bytes.data(), * src = (uint8_t *)&data + size - 1;
for (size_t i = 0; i < size; i++) {
*dst++ = *src--;
}
return _bytes;
}
И я хочу развернуть циклы for, используя std::index_sequence, и поскольку они связаны, я поместил их в один вопрос. Они заключаются в трех вещах: повторять что-то N раз, создавать последовательность индексов, которая уменьшается, а не увеличивается, и использовать индекс для установки значений.
Я пытался сделать это сам, но это не работает:

Код: Выделить всё

template
inline bytes CPU_Endian2(const T& data) {
size_t size = sizeof(T);
bytes _bytes(size);
uint8_t* dst = (uint8_t*)_bytes.data(), * src = (uint8_t*)&data;
[&](std::index_sequence){
((*dst++ = *src++),...);
}(std::make_index_sequence{});
return _bytes;
}
Он не компилируется, журнал ошибок:

Код: Выделить всё

Build started at 18:54...
1>------ Build started: Project: hexlify_test, Configuration: Release x64 ------
1>hexlify_test.cpp
1>C:\Users\Estranger\source\repos\hexlify_test\hexlify_test.cpp(98,3): error C7515: a fold expression must contain an unexpanded parameter pack
1>C:\Users\Estranger\source\repos\hexlify_test\hexlify_test.cpp(99,3): error C3878: syntax error: unexpected token '(' following 'expression'
1>C:\Users\Estranger\source\repos\hexlify_test\hexlify_test.cpp(99,3): message : error recovery skipped: '( identifier ::  . . . {'
1>C:\Users\Estranger\source\repos\hexlify_test\hexlify_test.cpp(99,35): error C2760: syntax error: '}' was unexpected here; expected ';'
1>Done building project "hexlify_test.vcxproj" -- FAILED.
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
========== Build completed at 18:54 and took 01.796 seconds ==========
Как преобразовать эти функции в те, которые используют std::index_sequence вместо циклов for?

При добавлении constexpr в size_t size = sizeof(T); не удалось скомпилировать его.

Подробнее здесь: https://stackoverflow.com/questions/785 ... -for-loops
Реклама
Ответить Пред. темаСлед. тема

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

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

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

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

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Попытка разделить пакет параметров на две меньшие пакеты, используя индексную последовательность, а вложенные лямбдас пр
    Anonymous » » в форуме C++
    0 Ответы
    5 Просмотры
    Последнее сообщение Anonymous
  • Spring: возврат на индексную страницу после отправки данных.
    Anonymous » » в форуме JAVA
    0 Ответы
    11 Просмотры
    Последнее сообщение Anonymous
  • Поведение циклов for в C++ и циклов while
    Anonymous » » в форуме C++
    0 Ответы
    18 Просмотры
    Последнее сообщение Anonymous
  • Сколько циклов тактовых циклов стоит экспоненты AVX/SSE на современном процессоре x86_64?
    Anonymous » » в форуме C++
    0 Ответы
    11 Просмотры
    Последнее сообщение Anonymous
  • Итератор для развертывания вложенных циклов в C++
    Anonymous » » в форуме C++
    0 Ответы
    6 Просмотры
    Последнее сообщение Anonymous

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