反转具有不同大小的不同成员的结构的所有位的有效方法是什么?
示例结构:
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;
}
}
如果优化版本确实有所作为,您可以尝试进行基准测试.它需要一个庞大的结构和一个不合理的呼叫数量.像这样的优化很少需要并且经常是错误的.

