嵌入式学习笔记--- c++结构体的内存按bit存取的实现
今天拜读公司大佬写的代码 发现了c++ 的结构体以及内存分布的一些实现细节,代码调整完demo 大概如下:(代码中的细节都删掉了,变量名全部换了 原本每一个bit 都带有自己的意义)后续对于bit 的访问 就可以直接按照上述的形式进行了,这样可以很方便的就操作到bit , 对于一些内存敏感的应用 会很方便,例如modbus 直接修改某一个输入寄存器的bit。
·
今天拜读公司大佬写的代码 发现了 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
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐


所有评论(0)