使用位字段保存内存
Using Bit Fields to save memory
我目前正在大学里启动一个关于ps3的项目,我们对代码的优化程度进行了评分。
我和我的合作伙伴一直在研究比特字段,因为我们处理的是0到255之间的数百万个数字。我们认为,如果我们可以将4个整数打包到4个字节(典型的整数大小的内存块)中,而不是只有一个,那么我们就可以将使用的内存减半。我们认为处理数据是我们能做出的最大优化之一,我们正在调查一切。这么麻烦值得吗?就编辑int而言,这似乎是一件很难处理的事情。我们还存在这样的问题,即理想情况下,我们需要取决于数字的不同比特字段,因为多达255需要9个比特,但大多数不需要这么多比特。
然后,我们还可以将数据快速传递给spu处理器,并有望在代码中引入并行性时看到巨大的改进。
如注释所述:
"优化通常是速度和空间之间的权衡。位字段可以节省空间,但处理速度比整数慢。"
由于的几个原因,很少使用位字段
- 它们操作起来很复杂,而且往往不会在内存使用方面产生巨大的节约。如果您的值足够小,可以保证有一个位字段,那么
char
应该能胜任这项工作,char
中的8位与32的int_32
相比,不会增加访问数据的开销 - 它们是特定于实现的-小心
一般经验法则:
- 让它发挥作用
- 如果速度较慢,请使其工作得更快
- 如果太大,请使其更紧凑
(注意,如果你知道要存储什么,你可以提前估计大小。在你开始优化缓存线(速度和内存都有一点)之前,只要它"合适",你可能会在内存使用情况上打勾)
仅供参考,位字段最常见的用法是将数据打包到为传输而设计的数据结构中。这只是我能找到的第一个例子
您只需要来自<cstdint>
C++标头(或C99中的<stdint.h>
)的int8_t
(有符号)或uint8_t
(无符号)8位整数。无需使用位字段(这些字段不可启动、速度慢且不易使用,例如,您无法获取它们的地址或引用)。
对于并行矢量处理,也可以考虑OpenCL和OpenMP,最终考虑OpenACC。最好使用最新的编译器,它也支持C++11。请注意,SPU是非常特定于硬件的。
根据您的应用程序,您可能会对SPU的实际性能感到有点失望,而OpenCL、OpenMP或OpenACC都不是银弹。Parallelism很难
- C++,您能否设计一种数据结构,将指针保存在连续内存中并且不会使它们失效?
- 是否可以通过每次在内存中仅保存一个平铺来处理完整的平铺 tiff 图像?
- 如何从文件中读取 100x24 矩阵并将其作为浮点矩阵保存在内存中?
- 如果我不将预先编写的字符串保存到变量,它还在内存中吗?
- 将内存保存到文件并加载它而不必解析数据?
- 声明变量以保存字符串列表时的内存分配
- 我的共享内存对象保存在哪里
- 在多次运行C++程序时将巨大的矩阵保存在内存中
- 在编译时检查特征类型保存的数据在内存中是否连续
- 局部变量保存相同的内存地址
- 读取.txt文件保存在内存中
- 保存未知数量的整数,而不会花费太多时间/内存
- 将它们(函数)保存在内存中的同一位置
- 什么设计模式将数据部分保存在持久存储 (SQL) 中,部分保存在 RAM(内存)中
- 将图像保存到内存
- GDI - 是否可以在WM_PAINT调用之间将位图保存在内存中
- C++ 如何将内存中的文件流保存到另一个位置
- 使用位字段保存内存
- 将Mat压缩到Jpeg中,并将结果保存到内存中
- WinBio保存捕获样本为图像-无法从内存中读取