#pragma包效果

2023-11-25

我想知道是否有人可以向我解释什么#pragma pack预处理器语句确实如此,更重要的是,为什么人们想要使用它。

我查看了MSDN 页面,这提供了一些见解,但我希望听到更多有经验的人的意见。我以前在代码中见过它,但我似乎找不到在哪里了。


#pragma pack指示编译器以特定对齐方式打包结构成员。大多数编译器在声明结构时会在成员之间插入填充,以确保它们与内存中的适当地址对齐(通常是类型大小的倍数)。这避免了与访问未正确对齐的变量相关的某些架构的性能损失(或彻底错误)。例如,给定 4 字节整数和以下结构:

struct Test
{
   char AA;
   int BB;
   char CC;
};

编译器可以选择将结构体放置在内存中,如下所示:

|   1   |   2   |   3   |   4   |  

| AA(1) | pad.................. |
| BB(1) | BB(2) | BB(3) | BB(4) | 
| CC(1) | pad.................. |

and sizeof(Test)将为 4 × 3 = 12,即使它只包含 6 个字节的数据。最常见的用例#pragma(据我所知)是在使用硬件设备时,您需要确保编译器不会在数据中插入填充,并且每个成员都遵循前一个成员。和#pragma pack(1),上面的结构将如下所示:

|   1   |

| AA(1) |
| BB(1) |
| BB(2) |
| BB(3) |
| BB(4) |
| CC(1) |

And sizeof(Test)将为 1 × 6 = 6。

With #pragma pack(2),上面的结构将如下所示:

|   1   |   2   | 

| AA(1) | pad.. |
| BB(1) | BB(2) |
| BB(3) | BB(4) |
| CC(1) | pad.. |

And sizeof(Test)将为 2 × 4 = 8。

结构体中变量的顺序也很重要。变量排序如下:

struct Test
{
   char AA;
   char CC;
   int BB;
};

#pragma pack(2),该结构将如下所示:

|   1   |   2   | 

| AA(1) | CC(1) |
| BB(1) | BB(2) |
| BB(3) | BB(4) |

and sizeOf(Test)将为 3 × 2 = 6。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

#pragma包效果 的相关文章

随机推荐

  • 无法让 @Rollback 为我的 Spring JPA 集成测试工作

    这是我的一个小测试课 问题是它不会在每次测试运行后回滚事务 我做错了什么 RunWith SpringJUnit4ClassRunner class ContextConfiguration locations META INF catal
  • Flutter:使用 Sliver 小部件时如何隐藏滚动时的 BottomAppBar?

    当用户向下滚动列表时 我试图隐藏底部应用程序栏 就像材料设计文档中行为部分中显示的那样 https material io design components app bars bottom html behavior 我正在寻找的效果如下
  • Django:文件下载后重定向

    我正在研究我的视图Django 1 5这允许我下载文件 下载过程是由按钮触发的HTML页面是这样的 a href a
  • 为什么流输出中的 < 而不是 << 仍然可以编译?

    今天 我在程序中犯了一个小错字 并且想知道为什么我没有得到任何输出 尽管程序编译得很好 基本上它可以简化为 include
  • 玩!框架:在单独的 JavaScript 文件中使用 URL 的最佳实践?

    我目前正在重新组织一个Play JS较多的项目 HTML 模板文件中的代码 该代码应移至外部 JS 文件具有更好的可读性和更快的页面加载时间 然而 当我刚刚在 public 文件夹中创建一个 JS 文件时 所有 Controller met
  • 如何在 Powershell 中等待并终止超时进程

    在 Windows 7 桌面中使用 Powershell 2 0 我想创建一个进程来运行 ant 命令 然后等待该进程在几分钟内完成 如果超时并且进程仍在运行 那么我想杀死它 我写了一些代码如下 p Start Process cmd ex
  • 如何查看“git stash -u”的未跟踪文件

    在 git 中存储内容非常有用 当存储未跟踪的文件并像这样浏览你的存储时 echo test gt foo git stash u foo is stashed git stash show p stash 0 未跟踪的文件不会显示 我们怎
  • 当前位置没有可用的来源

    我收到这个错误 Locating source for C Users cem Documents Visual Studio 2008 Projects CS Web Controls WebCropImage CropImage cs
  • 如何在 AngularJs 中设置全局 http 超时

    我知道我每次都可以设置超时 http get path to service timeout 5000 但我想设置一个全局超时以保持我的代码干燥 这可以通过前沿的 angular js 实现 使用 git master 4ae46814ff
  • 函数式编程:什么是“不正确列表”?

    有人可以解释一下什么是 不正确的列表 吗 我认为 Vijay 的答案是迄今为止最好的答案 我只是打算对其进行 Erlangify Erlang 中的对 cons 单元 写为 Head Tail nil 写成 对于头部和尾部是什么没有限制 但
  • 寻找 Properties.Settings.Default 的快捷方式

    我定义的选项越多 修改它们时需要输入的内容就越多 所以我正在寻找 Properties Settings Default varX 的较短版本 I tried Properties Settings settings Properties
  • Swift 相当于 `[NSDictionary initWithObjects: forKeys:]`

    是否有 Swift 原生的等价物Dictionary to NSDictionary initWithObjects forKeys 假设我有两个带有键和值的数组 并且想将它们放入字典中 在 Objective C 中我会这样做 NSArr
  • 在 POM 中使用 --enable-preview 执行 Maven 插件

    我有一个自定义 Maven 插件 它利用 JDK 12 预览功能 我编译插件设置 enable preview作为编译器参数 即
  • 使服务成为前台服务

    我有一个服务 我想将其设为前台服务 我的服务不需要与用户沟通 我在这个论坛上看到的最简单的例子就是将此代码放入服务中 Notification notification new Notification startForeground 54
  • 在 Asp Core 中将 IFormFile 转换为图像

    如果文件是图像 我需要调整文件上传的大小 我编写了用于调整大小的扩展 public static Image ResizeImage this Image image int width int height var res new Bit
  • python:生成整数分区

    我需要生成所有分区给定整数 我发现了 Jerome Kelleher 提出的算法 据说它是最有效的算法 def accelAsc n a 0 for i in range n 1 k 1 a 0 0 y n 1 while k 0 x a
  • Java 可序列化对象到字节数组

    假设我有一个可序列化的类AppMessage 我想将其传输为byte 通过套接字到另一台机器 在另一台机器上根据收到的字节进行重建 我怎样才能做到这一点 准备要发送的字节数组 ByteArrayOutputStream bos new By
  • 查询的结果不能被枚举多次

    我正在使用实体框架 ef 并收到以下错误 查询的结果不能被枚举多次 我有一个包含 ef 数据上下文的存储库类 然后我有一个控制器类 不要与 MVC 控制器混淆 其中包含存储库的实例 到目前为止一切顺利 我在控制器上有一个搜索方法 它应该返回
  • 如何在 PHP 中使用 BLENC?

    我有一个 testcode php 文件需要编码 我创建了文件encode php来加密和测试该文件
  • #pragma包效果

    我想知道是否有人可以向我解释什么 pragma pack预处理器语句确实如此 更重要的是 为什么人们想要使用它 我查看了MSDN 页面 这提供了一些见解 但我希望听到更多有经验的人的意见 我以前在代码中见过它 但我似乎找不到在哪里了 pra