Я хочу написать код memcpy, который вместо слова by by by by by by copy, чтобы увеличить скорость. (Хотя мне нужно сделать несколько байтов по байтам для последних или нескольких байтов). Поэтому я хочу, чтобы мой исходный адрес и адрес назначения были правильно выровнены. Я видел реализацию memcpy в glibc https://fossies.org/dox/glibc-2.22/string_2memcpy_8c_source.html он выполняет выравнивание только для адреса назначения. Но даже если адрес источника не правильно выровнен, это приведет к ошибке шины (проверьте, что проверка выравнивания включена в моем процессоре). Я не уверен, как правильно настроить выравнивание источника и адресата. Потому что, если я попытаюсь выровнять исходный код, скопировав несколько байтов по байтам, он также изменит адрес назначения, поэтому сначала адрес назначения, который был правильно выровнен, может быть неправильно выровнен. Так есть способ выравнивания обоих ?. Пожалуйста, помогите мне.Выравнивание как исходного, так и целевого адреса в memcpy
void memcpy(void *dst, void *src,int size)
{
if(size >= 8)
{
while(size/8) /* code will give sigbus error if src = 0x10003 and dst = 0x100000 */
{
*((double*)dst)++ = *((double*)src)++;
size = size - 8;
}
}
while(size--)
{
*((char*)dst)++ = *((char*)src)++;
}
}
Я не понимаю, как вы могли бы выровнять исходный адрес и dest? Извините, я просто не понимаю? –
@MartinJames Рассмотрим, что я передаю src = 0x10003 dest = 0x100000 и размер 15. Если в memcpy я хочу сделать слово за словом copy, я хочу, чтобы src был кратным 8 (64-разрядная ОС), поэтому следующий номер, который кратно 8 - 0x10006, поэтому для первых 3 байтов я сделаю байтовую копию по байтам, если я сделаю это, то src будет 0x10006, но dest = 0x100003, опять же dest не будет кратным 8. эта проблема будет продолжена. Итак, как я могу выровнять оба src и dest здесь. Если его невозможно, есть ли другой способ сделать слово за словом? – Praveen
Вы не можете. Предполагая, что вы перемещаете блок слов, если источник нечетный, но цель четная, вы в некотором смысле выравниваете несогласованные слова. С другой стороны, если источник четный, а цель нечетна, вы смещаете выровненные слова.Вы будете либо читать, либо писать несогласованные слова - это не совсем так, как копировать байт за раз. –