问题标签 [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.
c++ - 将一个类与其继承的类对齐?强制所有堆栈对齐?改变大小?
我想要一个基类来指示从它继承的对象的对齐方式。这适用于堆,因为我可以控制如何分配它,以及如何在自定义数组模板中分配它的数组。然而,就 C++ 而言,类的实际大小根本没有改变。也就是说,如果我对派生类的指针执行指针运算,那么它将跳到错误的位置。那是问题一。
问题二是堆栈对齐。似乎没有办法直接强制整个堆栈为 16 字节对齐的指针。
我唯一能看到影响这些的是 vc++ 和 g++ 编译器特定设置,但这里的问题是我不想一直手动修复对齐。那肯定容易出错,更不用说痛苦了。
我也可以制作某种智能指针,但这也会引入更多问题。
如果我只是对齐基类,子类也会对齐吗?如果是这样,那将解决我的大部分问题,但情况似乎令人怀疑(尽管我会尝试这个)。
c++ - 为什么 Visual Studio 不优化结构以获得最佳内存使用?
我的问题是为什么 Visual Studio 2012 编译器不自动重新排序结构成员以获得最佳内存利用率?编译器似乎完全按照它们在结构定义中声明的顺序存储成员,并根据成员对齐所需的一些空填充。在可能的情况下,重新排序似乎是比填充更可取的对齐成员的方式。是否有理由必须按声明顺序将其存储在内存中?
相关细节如下;
我有一个结构,它代表一个大数组中的单个元素。该元素有许多成员,一些是 32 位的,一些是 64 位的。我已调整默认结构成员对齐以获得最佳性能。
我在调试模式下探索内存,发现有很大一部分内存被浪费了。我将问题跟踪到 stuct 成员如何在内存中对齐。我知道 32 位成员必须在 DWORD 边界上对齐以获得最佳性能,显然 64 位成员必须在 QWORD 边界上对齐(我原以为 DWORD 边界就足够了)
我可以通过更改在结构定义中列出成员的顺序来解决问题。我确保尽可能连续放置 2 个 32 位成员,以便在 QWORD 边界上启动下一个 64 位成员不需要填充。
windows - GCC 和 clang 上的 MSVC /Zp 替代方案是什么?
以防万一,我想使用编译器标志在模块级别定义结构对齐,例如/Zp for cl 在 windows 上。GCC 和 clang 的替代方案是什么?
c++ - 使用 cl/gcc/clang 的默认结构封装是什么?
在 cl 编译器选项 /Zp 的 msdn 上,提到“在 8 字节边界上打包结构(默认)”。这是否意味着如果存在大小 > 8 字节的数据类型,默认情况下(没有编译器选项或编译指示包)它不会自然对齐,而是 8 字节对齐。如果是,那么 GCC/clang 就是这种情况吗?
我检查了 GCC,使用-fpack-struct
and __uint128_t
,它没有任何这样的默认值。例如sizeof(tStruct)
是 32 和 24:
我无法在 Windows 上检查相同的内容,因为它不提供任何大于 8 字节的数据类型。
c - C程序 - 结构变量数据打包和对齐
程序在 32 位机器(使用 GCC)上的输出是什么?解释。
输出显示
4、4。
上述程序是否与结构成员对齐填充和数据打包有关?
c++ - 这个结构对齐的原因是什么?
在 Vulkan 标头vulkan.h
中有一个结构定义为
我使用以下代码查看每个字段的对齐方式(Visual Studio 2015)
并得到了这些结果
字段之间flags
存在surface
8 个字节的间隙,即使flags
其底层类型为uint32_t
. queueFamilyIndexCount
字段和也是如此pQueueFamilyIndices
。当它们只有 4 个字节宽并且每个其他类型的字段只占用4 个字节时flags
,为什么要占用 8 个字节?这些偏移量的内存对齐要求有什么特别之处吗?queueFamilyIndexCount
uint32_t
c - 结构对齐安全使用
我是一家公司的新手,该公司完成了以下结构的使用:
我知道一些关于对齐和填充的事情,我假设编译器(用于 ARM9 设备的 gnu C99)将添加一些填充以使结构对齐。
但是这段代码安全吗?
据我了解,只要uint16 len
变量紧随其后,int8 array[]
无论其他结构成员如何,它都是安全的。
当它之前的大小是奇数时,它只会在 uint16 之前添加填充吗?
这种用法正确吗?更重要的是,它安全吗?
c - 为什么必须在 typedef 中指定此对齐属性?
我最初是从我的平板电脑上写下这个问题的,并且在这样做时采取了很多捷径,我认为最终会导致阅读和/或试图回答这个问题的人感到困惑。
我不是要解决我最初开始的问题。如果您真的想要背景故事,请阅读下一段,否则请跳过它。
造成这种情况的是一些旧代码对表单数据数组进行操作{struct, data, struct, data, ...}
,其中每个数据data
都有任意长度。代码通过指针访问每个结构,当我们切换到 gcc 时,由于未对齐的访问,它开始在 Solaris 中崩溃。解决这个问题的一个想法是改变类型的对齐方式,如下所示,但我可能不会这样做。
要回答的问题可以概括为:
- 文档状态对齐不能用 来减少
aligned
,但我可以用 typedef 来做到这一点。它是否按预期工作? - 如果它按预期工作,为什么它需要 typedef?为什么我不能降低对齐作为结构定义的一部分?
- 注意
typedef struct {...}__attribute__((aligned(1))) Typename;
:它也可以完成
- 注意
这是在 wandbox 上运行的一些示例代码的链接。如果链接失效:
c - sizeof c struct 仅具有 char 字段
我了解填充的工作原理。我知道对齐是什么。对我来说奇怪的是,为什么只有 char 字段的结构的大小没有与 4 个字节对齐(最后填充)?我怀疑规范根本无法保证这一点,因此编译器不会这样做。如果是这种情况,我可以获得对此类规则的参考吗?我最感兴趣的是 x86 和 x86-64 架构。
例子:
输出:sizeof=3
swift - UnsafeBytes 和 UnsafePointer 的快速对齐问题
在下面的代码中testP.deviceID
和testP.deviceID1
应该具有相同的值。但是 testP.deviceID1 包含 2(它应该包含 513)。因此,关于对齐,我不了解一些基本的东西吗?