2010-12-22 52 views
3

为什么我们需要在C++中有#pragma packtypedef结构?特别是当你在网络通信中使用这些结构时。#C++中的#pragma pack

+0

以下是您需要的所有信息。这是搜索查询`pragma pack`在谷歌搜索结果中的第一个词条:http://msdn.microsoft.com/en-us/library/aa273913%28v=vs.60%29.aspx – bezmax 2010-12-22 09:24:05

+0

这是怎么回事?面向对象编程? – 2010-12-22 09:24:11

回答

0

#pragma pack指令只修改声明遵循指令的结构成员的当前对齐规则。它不直接影响结构的对齐,但是通过影响结构成员的对齐,它可能会根据对齐规则影响整体结构的对齐。

13

#pragma pack#pragma pack控制结构成员的对齐。常见的默认设置是8,确保长达8个字节的成员在一个大小为倍数的地址上对齐。例如,一个双精度或64位指针。读取或写入错误对齐的double可能非常昂贵,如果跨越CPU高速缓存行边界,读写速度通常要慢三倍。这种对齐会在成员之间产生未使用的空间,称为填充。

这种定位往往是不恰当的网络框架,他们往往是紧密包装没有任何填充,包装的#pragma(推,1)

0

如果你只是需要让2个系统具有相同的设置聊(测试,...),你可以发送结构,只要它们是POD(普通的旧数据)(指针,虚拟表,std :: strings ...不能使用)。所以不需要包装。

如果系统没有相同的设置(或未知),则需要发送数据在协议中串行化,因此打包的结构将不会执行。检查是否有效的协议是最简单的。

0

编译器将“填充”结构的字段和子字段,即在内存中用空白的内存块来组织它们,这些内存块在中间不包含任何东西。正如Hans Passant的答案所解释的那样,这样做可以提高效率。

不同的编译器/目标/优化设置可能填充不同,在不等内存表示中转换相等的“逻辑”结构,所以如果两个通信机器之间传递结构,它们可能不会相互理解。

#pragma pack是您限制编译器自由填充的方法。

#pragma pack(push,1)命令编译器根本不填充。如果你这样做了用不同代码定义的两个相同的结构,它们将在内存中被相同地表示。然后,您可以安全地通过使用指针和sizeof()的某种协议在一个应用程序中发送结构的内容,并在另一端获取它,并使用指针和sizeof()将其写在相同的结构中。