问题标签 [structure-packing]

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 投票
2 回答
663 浏览

c++ - C++ 中的 sizeof(struct) 奇怪的输出

有人可以解释这段代码的输出吗?

输出:1 4 8

结构8的尺寸如何?

0 投票
5 回答
1076 浏览

c++ - 以符合标准的方式重新解释具有与数组相同类型的成员的结构

在各种 3d 数学代码库中,我有时会遇到这样的情况:

其中,AFAIK 是非法的,因为允许实现在成员之间虚假地添加填充,即使它们属于同一类型,但实际上没有人会这样做。

通过static_asserts 施加约束可以使其合法化吗?

static_assert没有被触发意味着operator[]什么是预期的并且在运行时不调用UB?

0 投票
2 回答
996 浏览

c++ - std::memcpy 结构与 TriviallyCopyable 类型 T 的紧密打包成员到 T 数组,反之亦然

这里已经确定,将 T 类型的紧密包装的连续结构成员视为 T 的数组是非法的。

但是复制底层表示呢?

鉴于:

具有相同的约束:

如下:

合法的?

0 投票
2 回答
84 浏览

c - 结构具有联合时的意外大小

我正在尝试验证结构的大小。由于某些原因,它给了我 18 的大小,而不是预期的 14 字节(联合的最大值应该为 8 + 2 + 2 = 12 字节)。有人能帮我吗?

这是我运行它时显示的内容:

0 投票
0 回答
53 浏览

c - GCC 端对齐结构

我正在研究内存分配器。每个分配的缓冲区都从 8 字节边界开始,每个缓冲区前面都有一个用于管理分配的标头(标头紧挨在 8 字节对齐缓冲区之前)。

标题看起来像:

假设这个结构的所有成员都被打包并且一个指针是 64 位的,那么这个结构的长度是 12 字节并且每个成员的对齐是正确的(因为结构的末尾是 8 字节对齐的)。

因此,我想告诉我的编译器两件事:

  1. 不要在结构的两个成员之间添加填充;和
  2. 不用担心,关于成员的对齐,他们对齐的。

我怎么能用 gcc 做到这一点?

使用__attribute__((packed)). 然而,虽然这对 1. 有用,但我的理解是它不包括 2.(即它会导致编译器插入代码来处理未对齐的访问,这在此处不需要)。

0 投票
1 回答
62 浏览

c - C 编程中的 pragmapack() 除了结构包装还有其他用途吗?

当我在接受采访时,面试官问我除了结构包装之外,C 语言中还有其他用法吗?所以我回答说除了结构包装我不知道。那么它还有其他用途吗?

0 投票
3 回答
640 浏览

c - 位域更加优化

我正在为 16 位微处理器编写一些代码。我的内存非常有限,只有 128 KB。MSP430 的 IAR C/C++ 编译器 我需要实现一些代码来节省一些内存。

我试图用这个 C 特性实现来实现它。

但有了这段代码,我仍然只使用 16 位字的 1 位。

我的目标是为两个 8 位变量使用相同字长的内存位。第一个变量应该在第二个变量的左边 8 位。

这可能吗?是否有任何实现,或者 C 中是否有为此的库?我该怎么做呢?

0 投票
1 回答
62 浏览

c++ - 创建异构顶点数据数组的便携式方法

在图形编程中使用顶点格式是很常见的。例如,这里描述了这一点。

但是,我正在寻找一种方法来完成不调用未定义行为的方法(我主要是在寻找 C++ 信息,但 C 也可以)。

常见的方法是这样的:首先,将您的顶点格式声明为结构。

然后,您创建一个数组,填充它们,并将它们发送到您的图形 API(例如:OpenGL)。

(旁白:我跳过了告诉 API 格式是什么的部分;我们假设它知道)。

但是,图形 API 不了解您的结构。它只需要内存中的一系列值,例如:

并且由于打包和对齐的问题,不能保证myVerts会在内存中以这种方式布局。

当然,大量的代码都是以这种方式编写的,并且它可以工作,尽管它不是可移植的。

但是有没有任何便携的方法可以做到这一点

?

这基本上是一个序列化问题。另请参阅:将缓冲区解释为结构的正确、可移植方式

我知道的主要符合标准的方法是将内存分配为char[]. 然后,您只需按照您想要的布局方式填写所有字节。

但是从struct Vertex上面的表示转换到那个char[]表示需要一个额外的副本(以及一个缓慢的逐字节的副本)。所以这是低效的。

或者,您可以直接将数据写入char[]表示,但这非常尴尬。verts[5].x = 3.0f这比寻址到字节数组、将浮点数写为 4 个字节等要好得多。

有没有一种好的、便携的方法来做到这一点?

0 投票
1 回答
57 浏览

c - 在指令 #pragma pack(n) 中,哪些值是 n 的有效值?

我做了谷歌,发现 n= 1,2,4,8 只是预处理器指令的有效参数#pragma pack(n)

有人可以告诉我上述值以外的值有什么问题吗?(例如 n=3,5 等为什么无效)?

上述值是唯一可以作为参数的值吗?

如何取 n 的值,为什么?

我正在使用 GCC 编译器。

0 投票
0 回答
44 浏览

c++ - C++问题,如何查看packing的默认值

我对结构中当前的打包方案有点困惑。举这个例子

这是输出:

我知道有一定的包装方案。但是假设大小为 8。这应该是 1+8 +4 + 填充不应该是 16,但是它被报告为 24。有没有办法可以找出包装的默认值?我目前在不太旧的mac上使用xcode。