今天拜读公司大佬写的代码 发现了 c++ 的结构体以及内存分布的一些实现细节,代码调整完demo 大概如下:(代码中的细节都删掉了,变量名全部换了 原本每一个bit 都带有自己的意义)

// 1.cpp
#include <stdint.h>
#include <iostream>
struct SomeStruct
{
    // 0 - 31 bit
    uint8_t u8_val_1;
    uint8_t u8_val_2;
    uint16_t /*reserve*/ : 16;
    // 上面 一共是 32bit 

    // 32 - 63 bit
    bool bit_0 : 1;
    bool bit_1 : 1;
    bool bit_2 : 1;
    bool bit_3 : 1;
    bool /*reserve*/ : 4;
    bool bit_8 : 1;
    bool bit_9 : 1;
    bool bit_10 : 1;
    bool bit_11 : 1;
    bool bit_12 : 1;
    bool /*reserve*/ : 3; // 13 14 15
    bool bit_16 : 1;
    bool bit_17 : 1;
    bool bit_18 : 1;
    bool bit_19 : 1;
    bool bit_20 : 1;
    bool bit_21 : 1;
    bool /*reserve*/ : 2;// 22 23 
    bool /*reserve*/ : 8;// 24 25 26 27  28 29 30 31  这里相当于 加 gap 占位

    // 64 - 383 bit
    uint64_t u64_val_1;
    float f1;
    float f2;
    float f3;
    float f4;
    float f5;
    float f6;
    float f7;
    float f8;

};
int main(int argc,char **argv)
{
    using namespace std;
    cout<< sizeof(SomeStruct) * 8 << " bits " << endl;
    return 0;
}
[xxx@xxx]$ g++ 1.cpp && ./a.out
384 bits

后续对于bit 的访问 就可以直接按照上述的形式进行了,这样可以很方便的就操作到bit , 对于一些内存敏感的应用 会很方便,例如 modbus 直接修改某一个输入寄存器的bit

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐