Jump to content

    
Sign in to follow this  
jenya7

отследить изменение переменной.

Recommended Posts

Например, такая вот глупая функция:

Не надо сравнивать несравнимые вещи. Посему прошу говорить об одном и том-же, а не подсовывать вместо теплого мягкое. Напишите и сравните результаты ИСХОДНОГО выражения:

if(*((uint32_t*)&new_packet[4]) != *((uint32_t*)&old_packet[4]))

и Вашего варианита с memcpy()

 

 

memcmp - то гарантированно работает с невыравненными данными.

Работа с элементом стуктуры так-же 100% работает с невыравненными данными. Ну и?

 

 

Share this post


Link to post
Share on other sites

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

Остался только вопрос - под какой это камень :)

 

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this