固定大小的数据类型,C ++,Windows类型

时间:2011-11-27 21:14:31

标签: c++

我正在尝试在所有Windows计算机上获得固定大小的浮动和整数。在,我有一个程序,我编译它并分发可执行文件。我希望数据类型在所有Windows计算机上具有恒定的位大小/排序。

我的第一个问题是http://msdn.microsoft.com/en-us/library/aa383751(v=vs.85).aspx定义的窗口类型是否在所有Windows计算机上都有固定大小(假设运行相同的操作系统 - Windows 7)。

基本上,我想通过网络传输结构中包含的数据,我希望避免将其全部放在字符串中或将其编码为可移植的二进制形式。

编辑:浮点数怎么样?

3 个答案:

答案 0 :(得分:2)

您应该使用

中的类型
#include <cstdint>

uint64_tint16_tint8_t等。

关于订购:我非常确定Windows只能在Big-Endian硬件上运行。无论如何,如果平台可移植性是一个问题,为什么不使用适当的序列化库并避免令人讨厌的意外?

答案 1 :(得分:1)

浮点

虽然没有C ++标准定义浮点值Microsoft has specified格式的大小,但它们始终使用floatdouble的4字节和8字节IEEE浮点格式类型分别。

积分

对于整数类型,Microsoft确实有compiler-specific defines的固定长度变量。一些非Microsoft编译器使用cstdint标头定义固定大小的整数类型。 这些都不基于官方标准。

序列化

这将是非常不可移植的,并且很可能会变成维护噩梦,因为你的结构变得更加复杂。你实际做的是定义一个容易出错的二进制序列化格式,必须通过约定来遵守。这个问题已经得到了更有效的解决。

我强烈建议使用协议缓冲区等序列化格式,或者使用boost :: serialization进行计算机之间的通信。如果您的数据正在接通线路,那么序列化/反序列化的性能将是传输时间的极小部分。

对齐

您将遇到的另一个严重问题是结构如何打包在内存中。在32位进程中,您的结构很可能在内存中的布局与在64位进程中的布局不同。

在32位进程中,结构成员将在字边界上对齐,在双字边界上对齐64位。

例如,该程序在64位平台上的32位和20输出24

#include <iostream>                                                                                                                                             
#include <cstdint>

struct mystruct {
        uint32_t y;
        double z;
        uint8_t c;
        float v;
} mystruct_t;

int main() {
        std::cout << sizeof(mystruct_t);
}

答案 2 :(得分:0)

如果您的编译器足够新,可以为您提供ISO C99(或最近的C ++中的<stdint.h>)所需的标准<cstdint>标头,那么您最好使用它(然后,它会使您的代码可移植,这个特殊问题,即使在非Windows系统上也是如此)。因此,请使用int32_tint64_t等类型

如果需要考虑跨多个平台的序列化,请考虑使用XDRASN1等可移植二进制格式,可能使用s11n库或JSON等文本格式或YAML