Con*_*ack 3 c++ memory bit-manipulation bitwise-operators bitset
有没有比使用for循环更好(更快/更有效)的方法在大内存块上执行按位操作?在查看选项后,我注意到std有一个成员std::bitset,并且还想知道在不更改其值的情况下将大区域内存转换为bitset会更好(甚至可能),然后执行操作,然后切换它的类型恢复正常?
编辑/更新:我认为union这里可能适用,这样内存块被分配了一个或多个new数组,int然后被操作为一个大的bitset.根据这里所说的内容,似乎可以在整个集合中完成操作:http://www.cplusplus.com/reference/bitset/bitset/operators/.
一般来说,没有比for循环更快的神奇方式.但是,通过记住以下几点,您可以使编译器更容易优化循环:
具有常量字节的xoring存储器的C99示例,假设long long为128位,缓冲区的开始对齐为16字节,而不考虑第3点.两个存储器缓冲区上的按位操作非常相似.
size_t len = ...;
char *buffer = ...;
size_t const loadd_per_i = 4
size_t iters = len / sizeof(long long) / loads_per_i;
long long *ptr = (long long *) buffer;
long long xorvalue = 0x5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5eLL;
// run in multiple threads if there are more than 4 MB to xor
#pragma omp parallel for if(iters > 65536)
for (size_t i = 0; i < iters; ++i) {
size_t j = loads_per_i*i;
ptr[j ] ^= xorvalue;
ptr[j+1] ^= xorvalue;
ptr[j+2] ^= xorvalue;
ptr[j+3] ^= xorvalue;
}
// finish long longs which don't align to 4
for (size_t i = iters * loads_per_i; i < len / sizeof(long long); ++i) {
ptr[i] ^= xorvalue;
}
// finish bytes which don't align to long
for (size_t i = (len / sizeof(long long)) * sizeof(long long); i < len; ++i) {
buffer[i] ^= xorvalue;
}
Run Code Online (Sandbox Code Playgroud)