有没有办法改变变量在内存中的存储方式(位大小)?

mik*_*ibi 3 c c++ serial-port visual-studio

假设我有以下数据结构(伪代码):

struct
{
  uint8  id;
  bool   failure;
  uint8  value;
}  
Run Code Online (Sandbox Code Playgroud)

现在让我们说我希望以下列方式在内存中存储数据:

bit 7-6:id bit 5:失败位4-0:值

反正在C/C++/Visual Studio中有没有这样做?我知道你可以在Ada做到这一点,但这并不意味着什么.

编辑:抱歉不清楚,我确实需要内存中的特定布局.此结构将用于通过串行通道发送的消息,并且需要符合接口规范

bdo*_*lan 7

您可以使用C位域:

struct
{
  uint8 id : 2;
  bool failure : 1;
  uint8 value : 5;
};
Run Code Online (Sandbox Code Playgroud)

但是,尽管这可能会减少用于struct*的内存量,但这并不能保证任何特定的内存布局; 为每个字段分配的特定位将取决于您的编译器和/或平台ABI.如果需要将特定位索引分配给特定字段,则需要手动打包和解压缩.或者,如果您的代码不需要是可移植的,您可以查看编译器如何打包位域,并相应地对结构的成员进行排序.

* - C标准对位域布局的限制很少,而C++甚至更少.通常它会导致较少的内存使用,但如果编译器决定它将使用的最小位域分配单元是32位字段或其他东西,那么大小实际上可能会增加.见ISO/IEC 9899:1999(E)§6.7.2.1/ 10

  • @Blindy:在某些编译器上,更改类型会导致启动新的分配单元. (3认同)