struct my_struct
{
char a;
short b;
int c;
};
sizeof(my_struct)
在不同的计算机上可能会有所不同(特别是任何标准C++类型的大小可能会有所不同)。 这还取决于内存对齐等因素(如#pragma pack(*)
等)。 那么实现固定大小结构体的最佳方法是什么?
struct my_struct
{
char a;
short b;
int c;
};
sizeof(my_struct)
在不同的计算机上可能会有所不同(特别是任何标准C++类型的大小可能会有所不同)。 这还取决于内存对齐等因素(如#pragma pack(*)
等)。 那么实现固定大小结构体的最佳方法是什么?
无论你做什么,都不能保证一个结构在所有可能的实现中都具有相同的大小。大约最接近的方法可能是:
struct my_struct {
char contents[some_size];
};
这至少保证了在所有实现中内容
的大小将是相同的。然而,实现仍然可以在内容
之后插入填充,因此在不同的实现中仍可能得到不同的大小。
DummyWrite(FileHandle, &my_struct, sizeof(my_struct))
这样的写法是错误的吗?如果我有成千上万个字段怎么办?我必须手动编写所有这些字段吗?那太可怕了! - Ivarschar
标准中确切为1字节int8_t
和 uint8_t
在C++11下确切为8位(大多数C++03编译器也提供这些)int16_t
和 uint16_t
在C++11下确切为16位int32_t
和 uint32_t
在C++11下确切为32位int64_t
和 uint64_t
在C++11下确切为64位char
数组字节序仍然是个问题,所以在转换多字节类型时需要处理这个问题。
试图设计一个结构体,在所有奇特的平台上都保证有相同的二进制表示方式是不可能的。如果只使用char
,你可以接近这个目标,但即使如此也不能保证因为你不知道一个字节里面有多少个位。
你可以尝试使用位域来表示你的数据,但你仍然不知道一个字节里面有多少个位,所以你无法确定会添加多少填充位于结尾。
可移植性有其作用:可移植代码比特定平台的代码更易于维护和扩展。追求可移植性仅为了“可移植性”的学术目标在专业编程中没有任何意义。另一方面,为了“可维护性”而追求可移植性是一个值得称赞的目标,但也需要权衡取舍。如果你想出一个完全可移植的解决方案,可以在所有可能的平台上运行,但只能在其中两个平台上运行,并且你的代码难以维护,那么这还有什么意义呢?__int*
是特定于平台的。int*_t
由标准定义。 - John Dibling