zltigo 0 16 декабря, 2015 Опубликовано 16 декабря, 2015 · Жалоба Например, такая вот глупая функция: Не надо сравнивать несравнимые вещи. Посему прошу говорить об одном и том-же, а не подсовывать вместо теплого мягкое. Напишите и сравните результаты ИСХОДНОГО выражения: if(*((uint32_t*)&new_packet[4]) != *((uint32_t*)&old_packet[4])) и Вашего варианита с memcpy() memcmp - то гарантированно работает с невыравненными данными. Работа с элементом стуктуры так-же 100% работает с невыравненными данными. Ну и? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
xvr 12 17 декабря, 2015 Опубликовано 17 декабря, 2015 · Жалоба gcc 4.8.2 не знает как инлайнить memcmp ( http://gcc.godbolt.org/ ), увы :( Если поииследовать memcpy (хотя она тут как телеге пятое колесо), то memcpy для выровненных данных заинлайнил: #include <memory.h> void do_memcmp(void* p1, const void* p2) { memcpy(__builtin_assume_aligned(p1,4),__builtin_assume_aligned(p2,4),4); } сделал do_memcmp(void const*, void const*): ldr r3, [r1] str r3, [r0] bx lr невыровненный тоже сделал: #include <memory.h> void do_memcmp(void* p1, const void* p2) { memcpy(p1,p2,4); } do_memcmp(void*, void const*): ldr r3, [r1] @ unaligned str r3, [r0] @ unaligned bx lr Остался только вопрос - под какой это камень :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться