问题标签 [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.
c++ - C++ 中的 sizeof(struct) 奇怪的输出
有人可以解释这段代码的输出吗?
输出:1 4 8
结构8的尺寸如何?
c++ - 以符合标准的方式重新解释具有与数组相同类型的成员的结构
在各种 3d 数学代码库中,我有时会遇到这样的情况:
其中,AFAIK 是非法的,因为允许实现在成员之间虚假地添加填充,即使它们属于同一类型,但实际上没有人会这样做。
通过static_assert
s 施加约束可以使其合法化吗?
即static_assert
没有被触发意味着operator[]
什么是预期的并且在运行时不调用UB?
c - 结构具有联合时的意外大小
我正在尝试验证结构的大小。由于某些原因,它给了我 18 的大小,而不是预期的 14 字节(联合的最大值应该为 8 + 2 + 2 = 12 字节)。有人能帮我吗?
这是我运行它时显示的内容:
c - GCC 端对齐结构
我正在研究内存分配器。每个分配的缓冲区都从 8 字节边界开始,每个缓冲区前面都有一个用于管理分配的标头(标头紧挨在 8 字节对齐缓冲区之前)。
标题看起来像:
假设这个结构的所有成员都被打包并且一个指针是 64 位的,那么这个结构的长度是 12 字节并且每个成员的对齐是正确的(因为结构的末尾是 8 字节对齐的)。
因此,我想告诉我的编译器两件事:
- 不要在结构的两个成员之间添加填充;和
- 不用担心,关于成员的对齐,他们是对齐的。
我怎么能用 gcc 做到这一点?
使用__attribute__((packed))
. 然而,虽然这对 1. 有用,但我的理解是它不包括 2.(即它会导致编译器插入代码来处理未对齐的访问,这在此处不需要)。
c - C 编程中的 pragmapack() 除了结构包装还有其他用途吗?
当我在接受采访时,面试官问我除了结构包装之外,C 语言中还有其他用法吗?所以我回答说除了结构包装我不知道。那么它还有其他用途吗?
c - 位域更加优化
我正在为 16 位微处理器编写一些代码。我的内存非常有限,只有 128 KB。MSP430 的 IAR C/C++ 编译器 我需要实现一些代码来节省一些内存。
我试图用这个 C 特性实现来实现它。
但有了这段代码,我仍然只使用 16 位字的 1 位。
我的目标是为两个 8 位变量使用相同字长的内存位。第一个变量应该在第二个变量的左边 8 位。
这可能吗?是否有任何实现,或者 C 中是否有为此的库?我该怎么做呢?
c++ - 创建异构顶点数据数组的便携式方法
在图形编程中使用顶点格式是很常见的。例如,这里描述了这一点。
但是,我正在寻找一种方法来完成不调用未定义行为的方法(我主要是在寻找 C++ 信息,但 C 也可以)。
常见的方法是这样的:首先,将您的顶点格式声明为结构。
然后,您创建一个数组,填充它们,并将它们发送到您的图形 API(例如:OpenGL)。
(旁白:我跳过了告诉 API 格式是什么的部分;我们假设它知道)。
但是,图形 API 不了解您的结构。它只需要内存中的一系列值,例如:
并且由于打包和对齐的问题,不能保证myVerts
会在内存中以这种方式布局。
当然,大量的代码都是以这种方式编写的,并且它可以工作,尽管它不是可移植的。
但是有没有任何便携的方法可以做到这一点
?
这基本上是一个序列化问题。另请参阅:将缓冲区解释为结构的正确、可移植方式
我知道的主要符合标准的方法是将内存分配为char[]
. 然后,您只需按照您想要的布局方式填写所有字节。
但是从struct Vertex
上面的表示转换到那个char[]
表示需要一个额外的副本(以及一个缓慢的逐字节的副本)。所以这是低效的。
或者,您可以直接将数据写入char[]
表示,但这非常尴尬。verts[5].x = 3.0f
这比寻址到字节数组、将浮点数写为 4 个字节等要好得多。
有没有一种好的、便携的方法来做到这一点?
c - 在指令 #pragma pack(n) 中,哪些值是 n 的有效值?
我做了谷歌,发现 n= 1,2,4,8 只是预处理器指令的有效参数#pragma pack(n)
。
有人可以告诉我上述值以外的值有什么问题吗?(例如 n=3,5 等为什么无效)?
上述值是唯一可以作为参数的值吗?
如何取 n 的值,为什么?
我正在使用 GCC 编译器。
c++ - C++问题,如何查看packing的默认值
我对结构中当前的打包方案有点困惑。举这个例子
这是输出:
我知道有一定的包装方案。但是假设大小为 8。这应该是 1+8 +4 + 填充不应该是 16,但是它被报告为 24。有没有办法可以找出包装的默认值?我目前在不太旧的mac上使用xcode。