https://gcc.gnu.org/bugzilla/show_bug.cgi?id=78995
--- Comment #5 from Richard Biener <rguenth at gcc dot gnu.org> --- (In reply to feiz from comment #4) > (In reply to Richard Biener from comment #2) > > static inline void > > rte_memcpy(void *dst, const void *src, size_t n) > > { > > uintptr_t dstu = (uintptr_t)dst; > > uintptr_t srcu = (uintptr_t)src; > > > > *(uint32_t *)dstu = *(const uint32_t *)srcu; > > > > this is violating strict aliasing rules as you are copying > > > > typedef unsigned short WORD; > > > > struct TFieldHeader > > { > > WORD FieldID; > > WORD Size; > > }; > > Well, that's right. I add the compile option -fno-strict-aliasing, and it > works. > To get a better performance, I got the rte_memcpy code from dpdk codes to > replace memcpy in our project. > > Very thanks for your help. And I have one more question about this. > > I check some instruction about aliasing, like > "Strict aliasing is an assumption, made by the C (or C++) compiler, that > dereferencing pointers to objects of different types will never refer to the > same memory location (i.e. alias eachother.)". > > I am confused, we always use the following actions, does this safe? yes > char buf[1024]; > struct A { > int a; > int b; > }; > > struct p * = (struct A*)buf; > p->a =01; > p->b = 02;