C++ 使用变量的一部分作为bool
假设内存很宝贵,我有一个类,它有一个C++ 使用变量的一部分作为bool,c++,performance,bit,C++,Performance,Bit,假设内存很宝贵,我有一个类,它有一个uint32\u t成员变量ui,我知道这些值将保持在100万以下。该类还包含一些bool成员 由于bool为1字节,因此使用ui的最高(最高2,3,…)位来节省内存有意义吗 如果它确实有意义,那么获得最高(最左边?)位(或第二位)的最有效方法是什么?我读了一些旧的文章,对于使用内联ASM或某种转换似乎存在分歧 把一部分钻头用作钻头有点危险。问题是,数字以二进制形式保存的方式,使得保持这种机制的正确性变得更加困难 负数保留为正数的补码。查看更多解释。您可以
uint32\u t
成员变量ui
,我知道这些值将保持在100万以下。该类还包含一些bool
成员
bool
为1字节,因此使用ui
的最高(最高2,3,…)位来节省内存有意义吗
把一部分钻头用作钻头有点危险。问题是,数字以二进制形式保存的方式,使得保持这种机制的正确性变得更加困难 负数保留为正数的补码。查看更多解释。您可以将数字指定为10,然后将布尔位从false设置为true,结果该数字可能变成巨大的负数 至于获取第n位是0还是1,您可以使用它,其中第0位是最右边的:
int nth_bit(int a, int n){
return a & (1 << n);
}
int第n位(int a,int n){
返回a&(1使用部分位作为bool有点危险。问题是数字以二进制形式保存的方式,使得保持机制正确变得更加困难
负数作为正数的补充。请查看更多说明。您可以将数字指定为10,然后将布尔位从false设置为true,结果该数字可能变成巨大的负数
至于获取第n位是0还是1,您可以使用它,其中第0位是最右边的:
int nth_bit(int a, int n){
return a & (1 << n);
}
int第n位(int a,int n){
返回一个&(1好吧,如果记忆真的很珍贵,你应该看得更深一些
1000000仅使用20位。这少于3个字节。因此,您可以分配3个字节来保留您的值,最多可分配4个布尔值。显然,访问会稍微复杂一些,但您可以节省25%的内存
例如,如果您知道这些值低于524287,则可以通过将其(使用bool)打包为20位,再节省15%:)
此外,如果您需要同时访问值和相应的bool,则将bool保留在单独的数组中(如您在评论中所说)会降低性能,因为它们相距很远,可能永远不会在缓存中。好吧,如果内存确实很宝贵,您应该深入查看
1000000仅使用20位。这少于3个字节。因此,您可以分配3个字节来保留您的值,最多可分配4个布尔值。显然,访问会稍微复杂一些,但您可以节省25%的内存
例如,如果您知道这些值低于524287,则可以通过将其(使用bool)打包为20位,再节省15%:)
另外,将bool保存在一个单独的数组中(正如您在评论中所说的)如果需要访问值和相应的BoL,则会导致性能下降,因为它们是相距甚远的,可能永远不会在缓存中。C++中完全支持C位字段语法。这可能是最好的解决方案,直到您能够比编译器有更好的优化实现。{bool a:1;uint32_t b:31;}Vistor GuangBin将对齐<代码> B<代码>,因为它与 < <代码>不属于同一类型。也许编译器特定成员支持指令会有帮助。C位字段语法完全支持C++。最好是解决方案,直到您能够有更好的优化实现。而不是编译器。struct A{bool A:1;uint32\u t b:31;}
内存很宝贵,但可能没有那么多。@VictorGubin将对齐b
,因为它与a
的类型不同。也许编译器特定的成员支持指令会有所帮助。谢谢。我意识到使用变量有两个缺点,所以我自己并不认为这是一个好主意。并且谢谢你的解决方案,但我认为对于一个4字节的变量,你的解决方案需要大量的移位。/谢谢。我意识到将一个变量用于两个目的有缺点,所以我自己并不认为这是一个好主意。谢谢你的解决方案,但我认为对于一个4字节的变量,你的解决方案需要很多正如我在其他地方所说的,我已经意识到,虽然这是C++专家向我提出的,但是在我的例子中,组合变量是没有意义的。值本身也经常被访问(<代码>布尔O/COD>不多)。所以每次我都必须计算出相应的值,这不是免费的。/@ MalkSt--永恒的困境:节省时间还是保存RAM?):谢谢你的回复!正如我在其他地方所说的,我已经意识到,尽管这是C++老手给我的建议,但是在我的例子中,组合变量是没有意义的。s也经常被访问(boolbool
不太多),因此每次我都必须计算相应的值,这不是免费的。:/@Markstar-永恒的困境:节省时间还是节省内存?:)