为什么我们需要在C++中有#pragma pack
为typedef
结构?特别是当你在网络通信中使用这些结构时。#C++中的#pragma pack
回答
#pragma pack指令只修改声明遵循指令的结构成员的当前对齐规则。它不直接影响结构的对齐,但是通过影响结构成员的对齐,它可能会根据对齐规则影响整体结构的对齐。
#pragma pack
#pragma pack
控制结构成员的对齐。常见的默认设置是8,确保长达8个字节的成员在一个大小为倍数的地址上对齐。例如,一个双精度或64位指针。读取或写入错误对齐的double可能非常昂贵,如果跨越CPU高速缓存行边界,读写速度通常要慢三倍。这种对齐会在成员之间产生未使用的空间,称为填充。
这种定位往往是不恰当的网络框架,他们往往是紧密包装没有任何填充,包装的#pragma(推,1)
如果你只是需要让2个系统具有相同的设置聊(测试,...),你可以发送结构,只要它们是POD(普通的旧数据)(指针,虚拟表,std :: strings ...不能使用)。所以不需要包装。
如果系统没有相同的设置(或未知),则需要发送数据在协议中串行化,因此打包的结构将不会执行。检查是否有效的协议是最简单的。
编译器将“填充”结构的字段和子字段,即在内存中用空白的内存块来组织它们,这些内存块在中间不包含任何东西。正如Hans Passant的答案所解释的那样,这样做可以提高效率。
不同的编译器/目标/优化设置可能填充不同,在不等内存表示中转换相等的“逻辑”结构,所以如果两个通信机器之间传递结构,它们可能不会相互理解。
#pragma pack是您限制编译器自由填充的方法。
#pragma pack(push,1)命令编译器根本不填充。如果你这样做了用不同代码定义的两个相同的结构,它们将在内存中被相同地表示。然后,您可以安全地通过使用指针和sizeof()的某种协议在一个应用程序中发送结构的内容,并在另一端获取它,并使用指针和sizeof()将其写在相同的结构中。
- 1. C++ #pragma pack
- 2. Valgrind和“#pragma pack(2)”
- 3. iphone上的pragma pack(push)
- 4. 如何追溯#pragma pack?
- 5. 什么禁用#pragma pack(push)?
- 6. VB6是否有等效的#pragma pack?
- 7. 在c中使用#pragma pack但无法理解
- 8. Pragma Pack使用导致jvm崩溃的C库
- 9. Pragma在C++结构类中
- 10. 什么是网络预设电台'的#pragma pack`呢?
- 11. Pragma Pack忽略和__attribute__((aligned(2),packed));没有任何效果
- 12. C pragma omp并行
- 13. python中的Pragma
- 14. C中#pragma和_Pragma()之间的差异
- 15. 在VS 2008/2010中控制尾随结构填充? (#pragma pack不够好)
- 16. #pragma在C中意味着什么?
- 17. 在Visual C++中禁用#pragma消息(“...”)?
- 18. 用例的#pragma开始和#pragma退出
- 19. 的#pragma hdrstop会
- 20. Clang中的Pragma消息?
- 21. 选择请求中的Pragma
- 22. 逗号WPF中的Pack URI
- 23. #pragma曾经相当于C++ builder
- 24. #pragma的铛诊断
- 25. WPF pack:/ [assemblyName]; component/... vs pack:// application:,,,/[assemblyName]; component/...?
- 26. '#pragma import on'是做什么的?
- 27. #pragma指令及其在c中的用法
- 28. 的SQLite PRAGMA table_info(表)不返回列名(在C#中使用Data.SQLite)
- 29. C#Pragma抑制引发错误的中断
- 30. 在Visual C++中通过#pragma comment(lib,...)导入错误的库
以下是您需要的所有信息。这是搜索查询`pragma pack`在谷歌搜索结果中的第一个词条:http://msdn.microsoft.com/en-us/library/aa273913%28v=vs.60%29.aspx – bezmax 2010-12-22 09:24:05
这是怎么回事?面向对象编程? – 2010-12-22 09:24:11