Я пытаюсь использовать массив uint8_t для массива uint32_t. Однако, когда я пытаюсь это сделать, я не могу получить доступ к каждому последующему 4 байтам.Чтение из unaligned uint8_t recast как массив uint32_t - не получение всех значений
Скажем, у меня есть массив uint8_t с 8 байтами. Я хотел бы получить доступ к байту 2 -> 6 как один uint32_t.
Они все получают одинаковое значение *((uint32_t*)&uint8Array[0])
, *((uint32_t*)&uint8Array[1])
, *((uint32_t*)&uint8Array[2])
, *((uint32_t*)&uint8Array[3])
Хотя *((uint32_t*)&uint8Array[4])
получает байты 4 -> 8, как ожидалось.
Похоже, я не могу получить доступ к 4 последовательным байтам с любого адреса?
Есть ли способ, которым я могу это сделать?
Вы не можете этого сделать. Вы можете получить доступ только к правильно выровненным словам. (Некоторые процессоры могут позволить вам уйти с ним, но это дополнительная работа над работой процессора, а некоторые процессоры не работают, а язык C не требует их.) Если вы хотите сделать неравномерный доступ портативно, у вас есть сделать это «вручную», как в ответе @ DietrichEpp. –
CUDA имеет очень хорошо документированные требования к выравниванию, и все транзакции памяти должны быть упорядочены по размеру транзакции – talonmies