固定大小的结构

时间:2014-01-13 14:27:15

标签: c++ struct size sizeof

struct my_struct
{
  char  a;
  short b;
  int   c;
};

sizeof(my_struct)可能因机器而异(任何标准c ++类型的大小可能会有所不同)。它也取决于内存对齐(#pragma pack(*)等)。实现固定大小结构的最佳方法是什么?

3 个答案:

答案 0 :(得分:2)

您无法保证结构在所有可能的实现上具有相同的大小。你可能得到的最接近的东西是:

struct my_struct { 
    char contents[some_size];
};

这至少可以保证contents在所有实现中的大小相同。尽管如此,实现仍可以在contents之后插入填充,因此您可以在不同的实现上获得不同的大小。

答案 1 :(得分:2)

如果你对目标平台有点现实和了解,你可以很容易地找到一些共同点,并将其作为你的结构的基础。

例如,如果您的目标平台是在当前x86硬件上运行的Windows和Linux,那么您已经了解了一些事情:

  • char正好是标准
  • 的1个字节
  • 1个字节是8位
  • int8_tuint8_t正好在C ++ 11下8位(大多数C ++ 03编译器都提供这些)
  • int16_tuint16_t在C ++ 11
  • 下正好是16位
  • int32_tuint32_t在C ++ 11
  • 下正好是32位
  • int64_tuint64_t正好是C ++ 11下的64位
  • C风格的ASCII字符串是以NULL结尾的char数组
  • 预处理程序指令可用于控制打包

Endianness仍然是一个问题,所以在转换多字节类型时你必须处理这个问题。

试图设计一个结构,该结构将由标准保证在所有奇异平台上的线上具有相同的二进制表示是不可能的。你可以只使用char来结束,但即使这样也无法保证,因为你知道一个字节中有多少位。

您可以尝试使用bitfields来表示您的数据,但您仍然不知道一个字节中有多少位,因此您无法证明最后会添加多少填充。< / p>

可移植性有一个目的:可移植代码比平台特定代码更易于维护和扩展。追求可移植性的可移植性是一个学术目标,在专业编程中没有任何地位。另一方面,追求可维护性的可移植性是一个值得称赞的目标,但它也是一种平衡行为。如果您想出一个适用于所有可能平台的完全可移植的解决方案,但是您只能在其中两个平台上运行并且您的代码无法维护,那么重点是什么?

答案 2 :(得分:1)

您可以打包您的结构以确定大小。以下是以便携方式实施该链接的链接:Visual C++ equivalent of GCC's __attribute__ ((__packed__))