问题标签 [struct-member-alignment]

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 投票
3 回答
1026 浏览

c++ - 将一个类与其继承的类对齐?强制所有堆栈对齐?改变大小?

我想要一个基类来指示从它继承的对象的对齐方式。这适用于堆,因为我可以控制如何分配它,以及如何在自定义数组模板中分配它的数组。然而,就 C++ 而言,类的实际大小根本没有改变。也就是说,如果我对派生类的指针执行指针运算,那么它将跳到错误的位置。那是问题一。

问题二是堆栈对齐。似乎没有办法直接强制整个堆栈为 16 字节对齐的指针。

我唯一能看到影响这些的是 vc++ 和 g++ 编译器特定设置,但这里的问题是我不想一直手动修复对齐。那肯定容易出错,更不用说痛苦了。

我也可以制作某种智能指针,但这也会引入更多问题。

如果我只是对齐基类,子类也会对齐吗?如果是这样,那将解决我的大部分问题,但情况似乎令人怀疑(尽管我会尝试这个)。

0 投票
4 回答
898 浏览

c++ - 为什么 Visual Studio 不优化结构以获得最佳内存使用?

我的问题是为什么 Visual Studio 2012 编译器不自动重新排序结构成员以获得最佳内存利用率?编译器似乎完全按照它们在结构定义中声明的顺序存储成员,并根据成员对齐所需的一些空填充。在可能的情况下,重新排序似乎是比填充更可取的对齐成员的方式。是否有理由必须按声明顺序将其存储在内存中?

相关细节如下;

我有一个结构,它代表一个大数组中的单个元素。该元素有许多成员,一些是 32 位的,一些是 64 位的。我已调整默认结构成员对齐以获得最佳性能。

我在调试模式下探索内存,发现有很大一部分内存被浪费了。我将问题跟踪到 stuct 成员如何在内存中对齐。我知道 32 位成员必须在 DWORD 边界上对齐以获得最佳性能,显然 64 位成员必须在 QWORD 边界上对齐(我原以为 DWORD 边界就足够了)

我可以通过更改在结构定义中列出成员的顺序来解决问题。我确保尽可能连续放置 2 个 32 位成员,以便在 QWORD 边界上启动下一个 64 位成员不需要填充。

0 投票
1 回答
403 浏览

windows - GCC 和 clang 上的 MSVC /Zp 替代方案是什么?

以防万一,我想使用编译器标志在模块级别定义结构对齐,例如/Zp for cl 在 windows 上。GCC 和 clang 的替代方案是什么?

0 投票
0 回答
2022 浏览

c++ - 使用 cl/gcc/clang 的默认结构封装是什么?

在 cl 编译器选项 /Zp 的 msdn 上,提到“在 8 字节边界上打包结构(默认)”。这是否意味着如果存在大小 > 8 字节的数据类型,默认情况下(没有编译器选项或编译指示包)它不会自然对齐,而是 8 字节对齐。如果是,那么 GCC/clang 就是这种情况吗?

我检查了 GCC,使用-fpack-structand __uint128_t,它没有任何这样的默认值。例如sizeof(tStruct)是 32 和 24:

我无法在 Windows 上检查相同的内容,因为它不提供任何大于 8 字节的数据类型。

0 投票
4 回答
162 浏览

c - C程序 - 结构变量数据打包和对齐

程序在 32 位机器(使用 GCC)上的输出是什么?解释。

输出显示

4、4。

上述程序是否与结构成员对齐填充和数据打包有关?

0 投票
2 回答
480 浏览

c++ - 这个结构对齐的原因是什么?

在 Vulkan 标头vulkan.h中有一个结构定义为

我使用以下代码查看每个字段的对齐方式(Visual Studio 2015)

并得到了这些结果

字段之间flags存在surface8 个字节的间隙,即使flags其底层类型为uint32_t. queueFamilyIndexCount字段和也是如此pQueueFamilyIndices。当它们只有 4 个字节宽并且每个其他类型的字段只占用4 个字节时flags,为什么要占用 8 个字节?这些偏移量的内存对齐要求有什么特别之处吗?queueFamilyIndexCountuint32_t

0 投票
2 回答
158 浏览

c - 结构对齐安全使用

我是一家公司的新手,该公司完成了以下结构的使用:

我知道一些关于对齐和填充的事情,我假设编译器(用于 ARM9 设备的 gnu C99)将添加一些填充以使结构对齐。

但是这段代码安全吗?
据我了解,只要uint16 len变量紧随其后,int8 array[]无论其他结构成员如何,它都是安全的。

当它之前的大小是奇数时,它只会在 uint16 之前添加填充吗?
这种用法正确吗?更重要的是,它安全吗?

0 投票
2 回答
618 浏览

c - 为什么必须在 typedef 中指定此对齐属性?

我最初是从我的平板电脑上写下这个问题的,并且在这样做时采取了很多捷径,我认为最终会导致阅读和/或试图回答这个问题的人感到困惑。

我不是要解决我最初开始的问题。如果您真的想要背景故事,请阅读下一段,否则请跳过它。

造成这种情况的是一些旧代码对表单数据数组进行操作{struct, data, struct, data, ...},其中每个数据data都有任意长度。代码通过指针访问每个结构,当我们切换到 gcc 时,由于未对齐的访问,它开始在 Solaris 中崩溃。解决这个问题的一个想法是改变类型的对齐方式,如下所示,但我可能不会这样做。

要回答的问题可以概括为:

  • 文档状态对齐不能用 来减少aligned,但我可以用 typedef 来做到这一点。它是否按预期工作?
  • 如果它按预期工作,为什么它需要 typedef?为什么我不能降低对齐作为结构定义的一部分?
    • 注意typedef struct {...}__attribute__((aligned(1))) Typename;:它也可以完成

这是在 wandbox 上运行的一些示例代码的链接。如果链接失效:

0 投票
1 回答
93 浏览

c - sizeof c struct 仅具有 char 字段

我了解填充的工作原理。我知道对齐是什么。对我来说奇怪的是,为什么只有 char 字段的结构的大小没有与 4 个字节对齐(最后填充)?我怀疑规范根本无法保证这一点,因此编译器不会这样做。如果是这种情况,我可以获得对此类规则的参考吗?我最感兴趣的是 x86 和 x86-64 架构。

例子:

输出:sizeof=3

0 投票
0 回答
111 浏览

swift - UnsafeBytes 和 UnsafePointer 的快速对齐问题

在下面的代码中testP.deviceIDtestP.deviceID1应该具有相同的值。但是 testP.deviceID1 包含 2(它应该包含 513)。因此,关于对齐,我不了解一些基本的东西吗?