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