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

标签 c++ c visual-studio serial-port

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

struct
{
  uint8  id;
  bool   failure;
  uint8  value;
}  

现在假设我希望数据以下列方式存储在内存中:

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

有没有办法在 C/C++/Visual Studio 中做到这一点?我知道您可以在 Ada 中做到这一点,但这并不重要。

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

最佳答案

您可以使用 C 位域:

struct
{
  uint8 id : 2;
  bool failure : 1;
  uint8 value : 5;
};

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

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

关于c++ - 有没有办法改变变量在内存中的存储方式(位大小)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6655197/

相关文章:

c - 在 GCC 中对齐 malloc()?

c++ - Qt 图像类型的 Visual Studio 2010 调试器可视化工具?

c++ - 链接基于 Dcmtk 的 C++ 程序的库?

visual-studio - 如何引用 .cpp 文件而不将它们包含在 Visual Studio 的解决方案中?

C++:如何本地化已编写的程序

c - 为什么我在写入文件时神秘地出现段错误?

visual-studio - Microsoft Visual Studio 2012 已停止工作

c++ - 在 Windows 上获取实际文件名(使用正确的大小写)

c++ - Boost 1.45 - 1.49 在使用 Visual Studio 2010 时与 MySql C++ Connector 1.1 中断

c - 逐行读取文本文件中的字符串并将其存储在链表中