【发布时间】:2010-09-26 00:15:18
【问题描述】:
我可以在托管代码中分配的最小内存量是一个字节是真的吗?
我是否正确理解布尔变量占用的内存远不止一点点?
有没有办法让我在 .net 中以小于一个字节的块分配内存?
【问题讨论】:
-
在汇编程序中甚至不可能。
我可以在托管代码中分配的最小内存量是一个字节是真的吗?
我是否正确理解布尔变量占用的内存远不止一点点?
有没有办法让我在 .net 中以小于一个字节的块分配内存?
【问题讨论】:
这是正确的,分配是按字节粒度进行的(可能四舍五入到偶数字节甚至更高)。我使用过的任何操作系统都是如此,因此它并不特定于托管代码。内存管理器使用字节,而不是位。
另一方面,如果您有大量布尔值并希望获得更高的存储效率,将布尔值打包成位数组并不难(请参阅BitArray)。
【讨论】:
您不能在任何计算机上分配内存(据我所知)小于一个字节,绝对不能在 PC 上。
此外,使用 .net 您 不会分配任何内存,除非您在 .Net 中使用 C++(使用垃圾收集,最好说您是“使用”内存而不是“分配”内存,实际上无法判断对 new 的调用是分配内存还是重用内存)。
如果您使用 C++,即使您可能要求一个字节,操作系统也会分配一块内存供您的程序使用,这几乎肯定会超过一个字节。
如果您想存储一个位数组,您可以滚动您自己的 BitArray 集合,其中您将存储的最小值是一个字节(实际上您应该使用整数),然后您将这些位打包和解包。
幸运的是 .Net 3.5 带有 BitArray class(显然 1.0、1.1、2.0、3.0 ......感谢 Joe)
但是,总是要付出代价的。打包和解包位将比保存布尔数组慢。
希望对你有帮助
【讨论】:
如果您想以节省空间的方式存储大量布尔值,请查看BitArray class。
【讨论】:
尝试迁移到Intel 4040。那么你的布尔值将只使用 4 位。但是,如果您在跳蚤市场上找不到,或者碰巧在阁楼上,我会推荐位数组,因为随着 64 位的惊人出现,您的布尔值将变得像双精度数一样大,恐怖!
【讨论】: