gpt4 book ai didi

c - #pragma 包效果

转载 作者:太空狗 更新时间:2023-10-29 16:13:48 24 4
gpt4 key购买 nike

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

我检查了 MSDN page ,它提供了一些见解,但我希望能听到更多有经验的人的意见。我以前在代码中看到过它,但我似乎再也找不到它了。

最佳答案

#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.................. |

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

|   1   |

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

sizeof(Test) 将是 1 × 6 = 6。

使用#pragma pack(2),上面的结构将像这样布局:

|   1   |   2   | 

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

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) |

sizeOf(Test) 将是 3 × 2 = 6。

关于c - #pragma 包效果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3318410/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com