如何在内存块(C )上进行位置
How to bitwise operate on memory block (C++)
是否有更好(更快/更有效的)在大型内存块上执行比特操作的方法?在寻找选项之后,我注意到STD具有成员std::bitset
,并且还在想是否会更好(甚至可能)将大区域的存储器转换为bitset而不更改其值,然后执行操作,然后再执行将其类型切换回正常?
编辑/更新:我认为union
可能在此处应用,以便将内存块分配为new
的int
或其他东西,然后用作大型bitset
。操作似乎可以根据这里所说的内容在整个集合中完成:http://www.cplusplus.com/reference/reference/bitset/bitset/bitset/operators/。
通常,没有比循环快的魔法方法。但是,您可以使编译器更容易通过牢记一些事情来优化循环:
- 一次将最大的可用整数类型加载到内存中。但是,如果缓冲区的长度不均匀地除以整数类型的大小,则需要小心。
- 如果可能的话,在一个循环迭代中在多个值上操作 - 这应该使编译器的矢量化变得更加简单。同样,您需要注意缓冲长度。
- 如果循环要多次在代码的简短部分上运行,请使用一个向下计数到零而不是向上的循环索引,并从数组长度中减去它 - 这使得CPU的分支预测变量变得更容易。出去发生了什么。
- 您可以使用编译器提供的显式向量扩展名,但这将使您的代码不那么便携。
- 最终,您可以在汇编中编写循环,并使用CPU提供的向量说明,但这是完全不可支配的。
- [编辑]此外,您可以使用OpenMP或类似的API将循环分配在多个线程之间,但这只有在您在大量内存上执行操作时才会改善。
c99具有常数字节的Xoring内存的示例,假设长为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;
}
相关文章:
- 你好。。。id_public变量不应该给出结果为 81 和 86 吗?为什么它为两个派生类占用不同的内存位置?
- 内存所有位置 wxWidgets
- 为什么字符串的 move() 会改变内存中底层数据的位置?
- 如何在不等待检索的情况下获取C++中的内存位置?
- 内存中类位置的成员是否取决于类成员在类定义中的位置?
- 向量的内存位置不连续
- 如何根据C++在同一内存位置重新初始化 C# 中的对象(还是自动完成)?
- 常量引用的内存位置
- C++强制变量到一个固定的内存位置
- 为什么未初始化的内存位置的值给出 -842150451 的值?
- 为什么存储在内存位置的值会发生变化?
- 在特定内存位置构造 c++ 对象
- 如果不初始化结构中的向量,它会自动为空还是具有随机内存位置的值?
- 如何识别内存泄漏的位置
- 内存位置出现Microsoft C++异常:std::out_of_range
- 函数,返回变量c++占用的内存位置的大小
- 在尝试使用CUDA分配内存时,我遇到了访问冲突写入位置错误
- delete如何知道对象在内存中的起始位置
- 无法在 Opencv 中显示图像导致内存位置
- 如何修复<程序名称>中的"<内存位置>未处理的异常。Visual Studio 2017 中的访问冲突写入位置<内存位置>"