Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/154.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用变量的一部分作为bool_C++_Performance_Bit - Fatal编程技术网

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,…)位来节省内存有意义吗

  • 如果它确实有意义,那么获得最高(最左边?)位(或第二位)的最有效方法是什么?我读了一些旧的文章,对于使用内联ASM或某种转换似乎存在分歧


  • 把一部分钻头用作钻头有点危险。问题是,数字以二进制形式保存的方式,使得保持这种机制的正确性变得更加困难

    负数保留为正数的补码。查看更多解释。您可以将数字指定为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也经常被访问(bool
    bool
    不太多),因此每次我都必须计算相应的值,这不是免费的。:/@Markstar-永恒的困境:节省时间还是节省内存?:)