反转具有不同大小的不同成员的结构的所有位的有效方法是什么?
示例结构:
typedef struct { uint16_t mem1; uint8_t mem2; uint32_t mem3; uint8_t mem4[4]; } sample_struct;
解决方法
一种简单而通用的方法是使用这样的函数:
void *memxor(void *p,int val,size_t size) { unsigned char *pb = p; while (size-- > 0) *pb++ ^= (unsigned char)val; return p; }
并以这种方式使用它:
sample_struct s; ... memxor(&s,~0,sizeof s);
如果由于某种原因,您想要优化更多,请尝试以下方法:
void meminvert(void *ptr,size_t size) { if (((uinptr_t)ptr | size) & (sizeof(unsigned int) - 1)) { unsigned char *p = ptr,*pe = pb + size; while (p < pe) *p++ ^= ~0U; } else { unsigned int *p = ptr,*pe = p + size / sizeof *p; while (p < pe) *p++ ^= ~0U; } }
如果优化版本确实有所作为,您可以尝试进行基准测试.它需要一个庞大的结构和一个不合理的呼叫数量.像这样的优化很少需要并且经常是错误的.