Мне интересно узнать о соглашениях для указателей / массивов типов в C ++. Вот пример использования, который у меня есть на данный момент:
Compute a simple 32-bit checksum over a binary blob of data by treating it as an array of 32-bit integers (we know its total length is a multiple of 4), and then summing up all values and ignoring overflow.
Я ожидал, что такая функция будет выглядеть так:
uint32_t compute_checksum(const char *data, size_t size)
{
const uint32_t *udata = /* ??? */;
uint32_t checksum = 0;
for (size_t i = 0; i != size / 4; ++i)
checksum += udata[i];
return udata;
}
Теперь у меня возникает вопрос: какой способ преобразования data
в udata
вы считаете «лучшим»?
С-стиль?
udata = (const uint32_t *)data
Приведение в C ++, которое предполагает, что все указатели конвертируемы?
udata = reinterpret_cast<const uint32_t *>(data)
С ++ приводит ли это между произвольными типами указателей с использованием промежуточных void*
?
udata = static_cast<const uint32_t *>(static_cast<const void *>(data))
Бросить через профсоюз?
union {
const uint32_t *udata;
const char *cdata;
};
cdata = data;
// now use udata
Я полностью понимаю, что это не будет 100% портативное решение, но я ожидаю использовать его только на небольшом наборе платформ, где, как я знаю, оно работает (а именно, невыровненный доступ к памяти и предположения компилятора по сглаживанию указателей). Чтобы вы посоветовали?