问题标签 [pragma-pack]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
11 回答
251247 浏览

c - #pragma 包效果

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

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

0 投票
1 回答
3473 浏览

c++ - C++ #pragma 包

以下语句实际上做了什么以及它的效果是什么?

0 投票
3 回答
640 浏览

c++ - 网络编程中的“#pragma pack”是什么?

我下载了一个教程,它在头文件中有这些行。如果你们能提供与此相关的任何教程或参考资料,我将不胜感激。

0 投票
5 回答
156136 浏览

c - gcc 的 __attribute__((packed)) / #pragma pack 不安全吗?

在 C 中,编译器将按照声明的顺序排列结构的成员,并在成员之间或最后一个成员之后插入可能的填充字节,以确保每个成员正确对齐。

gcc 提供了一个语言扩展 ,__attribute__((packed))它告诉编译器不要插入填充,从而允许结构成员不对齐。例如,如果系统通常要求所有int对象具有 4 字节对齐,__attribute__((packed))可能会导致int结构成员以奇数偏移量分配。

引用 gcc 文档:

`packed' 属性指定变量或结构字段应该具有最小可能的对齐方式——变量一个字节,字段一个位,除非您使用 `aligned' 属性指定更大的值。

显然,使用此扩展可能会导致更小的数据需求但更慢的代码,因为编译器必须(在某些平台上)生成代码以一次访问一个字节的未对齐成员。

但是在任何情况下这是不安全的吗?编译器是否总是生成正确的(虽然速度较慢)代码来访问打包结构的未对齐成员?它甚至有可能在所有情况下都这样做吗?

0 投票
1 回答
286 浏览

c++ - iphone上的pragma pack(推送)

我在#pragma pack(push,1)and中有一个结构#pragma pack(pop)。我想知道这是否可以在 iphone 编译器上正常工作,以及这些宏之外是否还有其他副作用。

谢谢,拉克斯万。

0 投票
3 回答
2704 浏览

c++ - Visual Studio 中 pragma pack 指令的范围

#pragma packVisual C++中对齐的范围是什么?API 参考 https://msdn.microsoft.com/en-us/library/vstudio/2e70t5y1%28v=vs.120%29.aspx 说:

pack 在看到 pragma 后的第一个结构、联合或类声明时生效

因此,对于以下代码:

我已经预料到:

但我收到了:

这就是为什么我有点惊讶,我非常感谢你能提供的任何解释。

0 投票
1 回答
2929 浏览

c++ - __attribute__((__packed__)); 有什么区别?和#pragma pack(1)

我正在将在 Linux 上完美运行的代码移植到 windows visual c++。我在 Linux 中有这段代码:

我在 Windows 上遇到错误:

我想知道是否可以通过使用来修复此错误

它们之间有什么区别吗?是否有任何语法可以在 Linux 和 Windows 中用于此属性?

0 投票
1 回答
4471 浏览

visual-c++ - #pragma pack(8) 应该如何工作?

我是结构对齐和打包的新手。我以为我明白了,但我发现了一些我没想到的结果(见下文)。

我对结构对齐的理解是:

  1. 类型通常在其大小的倍数的内存地址上对齐。

  2. 根据需要添加填充以促进正确对齐

  3. 结构的末尾必须填充到最大元素的倍数(以方便数组访问)

#pragma pack指令基本上允许覆盖基于类型大小对齐的一般约定:

令我惊讶的是,在 VS 2015 x86 上 sizeof(SPack8) == 24。似乎 d 没有在 8 字节地址上对齐:

有人可以解释发生了什么/我误解了什么吗?

谢谢!

0 投票
1 回答
949 浏览

c++ - 打包结构成员的传递地址

我正在开发一个 C/C++ 应用程序,其中我正在使用打包的结构成员。我读过我们永远不应该将压缩结构成员的地址传递给任何函数(当通过引用函数作为参数传递压缩结构成员时,我总是会遇到对齐错误)。所以我想知道这是否适用于 sscanf 等内置类似函数的情况。这是我的代码片段

我正在运行我的 Power PC 架构应用程序。

0 投票
3 回答
1082 浏览

c - C - 为什么#pragma pack(1) 将 6 位结构成员视为 8 位?

#pragma pack(1)在定义字段6-bit并将其假定为8-bit. 我读了这个问题来解决我的问题,但它根本没有帮助我。

Visual Studio 2012中,我定义struct了以下用于保存Base64字符:

现在我得到了它的大小sizeof,但结果不是我所期望的:

结果 :4

我期望得到3(因为6 * 4 = 24,所以24位是3字节)

事件我用1-bit字段测试它并得到正确的大小(1字节):

实际上,为什么6-bit假设8-bit#pragma pack(1)