问题标签 [alignof]
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++ - 对于所有对象类型 T,sizeof(T) >= alignof(T) 是否总是如此?
对于任何对象类型T
,是否总是sizeof(T)
至少与alignof(T)
?
直观上看起来是这样,因为即使您调整对象的对齐方式,例如:
在通常情况下,它们的“大小”也向上调整,以便数组中对象之间的关系在保持对齐的同时有意义(至少在我的测试中。例如:
大小和对齐方式均为 16。
c++ - `T` 是否总是与`std::aligned_storage 具有相同的大小和对齐方式`
在什么情况下,标准要求与T
具有完全相同的大小和对齐方式std::aligned_storage<sizeof(T), alignof(T)>
?
我一直认为答案是,但是从今天的其他 SO 答案中,我了解到对于一些晦涩难懂的东西T
,它可能是实现定义的。如果实现支持扩展对齐类型,如 128 位整数,那么std::aligned_storage
如果我理解正确,是否最终具有 128 位对齐取决于实现。
是否有其他类型T
的问题的答案可能是实现定义的?
在我的应用程序中,我基本上有一个std::tuple<T, U, V>
未知类型的元组,并且我希望能够尽可能有效地获取该元组中成员的偏移量,最好是在编译时。T
U
V
(我意识到这是一件非常奇怪的事情。我正在尝试修复一些现有代码,其中元组使用 覆盖在“布局兼容”类型之上reinterpret_cast
。这种不相关对象之间的强制转换是非法的并且违反了严格的别名规则。如果我可以得到成员的偏移量,那么我可以排除非法演员。)
AFAIK,这不能在 C++14 内完成constexpr
。但它可以非常接近,我的代码如下所示:
在实验中,大多数现代编译器将其优化为一个常量,即使涉及重新解释转换等,并且该offset
函数不能完全被标记constexpr
。
在这里使用的要点std::aligned_storage
是,即使元组的成员不是默认可构造的,具有非平凡的初始化等。将它们替换为std::aligned_storage
使它们可以在不改变元组布局的情况下轻松构造。
但是,如果对于某些类型,交换类型以std::aligned_storage
更改大小或对齐方式,这可能会破坏我的整个方法并导致计算错误的偏移量。
c - 为什么 alignof(max_align_t) 是 16?
我在 x86_64 Intel 处理器上运行 Debian。
gcc (Debian 8.3.0) 编译以下程序
和输出
什么数据类型需要 16 字节对齐?
c++ - alignof(T*) 对于所有可能的类型都相同吗?sizeof(T*) 呢?
alignof(T*)
所有可能类型的值是否相同T
?怎么样sizeof(T*)
?请根据标准允许/指定的内容而不是不同编译器的当前情况来回答。
c - 结构体的 sizeof 和 _Alignof 值
下列哪项在标准 C 中是正确的?
(A) asizeof
结构等于:
其最后一个成员的相对地址加上
sizeof
其最后一个成员。(我知道这不可能是真的。)其最后一个成员的相对地址加上其最后一个成员的对齐值(由运算
_Alignof
符获得)。(这也不正确,因为在某些情况下a 类型可能大于其值。请参阅32 位 Windows GCC:是 12,是 4。)sizeof
_Alignof
long double
sizeof
_Alignof
其最后一个成员的相对地址加上结构本身的对齐值。(这也不可能是真的,正如前面的陈述中所解释的那样。)
其最后一个成员的相对地址加上最后一个成员的最大大小和结构本身的对齐值。
别的东西。
相对地址是指其最后一个成员的起始字节与其第一个成员(或结构本身)的起始字节之间的距离,可以使用如下offsetof
宏获得:offsetof(struct st, last_member)
.
(B)结构的_Alignof
值等于:
_Alignof
其最大成员的 值_Alignof
。别的东西。
笔记:
我不是在谈论特定环境中的特定实现,而是在理论上,符合“标准 C (C18)”的实现应该如何表现。
_Alignof
是标准的 C 运算符,是在header 中alignof
定义的宏同义词。stdalign.h
alignment - 错误:在 MDK ARM uVision v5 ARM Compiler 5 中使用 __align() 时,此处可能未指定存储类
我正在将一个项目从 CubeIDE (GCC) 迁移到基于 Arm® 的微控制器 uVision (ARM Compiler 5) 的最全面的软件开发解决方案,并且在使用__align
关键字时遇到了困难。
在 CubeIDE 中编译良好的 CubeIDE 代码:
第一个问题是 uVision 找不到 <stdalign.h> ,它是C 编程语言标准库的一部分:
所以我删除了 <stdalign.h> 并基于这些 KEIL 文档将我的代码重写为
现在我收到以下错误:
任何有关如何在 uVision 中进行对齐的帮助将不胜感激。
c - 打包原始数据中的有效类型
为了避免在非常大的数据集上出现内存碎片,我实现了一个避免调用malloc
两次的双向链表:一个malloc
用于数据,另一个用于prev
andnext
节点。相反,它会在一个镜头中分配所需的空间,alignof
以获取struct
包含prev
和next
节点的偏移量。
实现在这里,但提取了相关部分:
然后,在main
:
wheredata
可以是指向任何原始类型或复合类型的指针。
问题是它不是包含所有相关成员的典型打包结构:
我担心有效的类型规则:
如果通过具有非字符类型类型的左值将值存储到没有声明类型的对象中,则左值的类型将成为该访问的对象的有效类型以及不修改该类型的后续访问储值。
该规则如何影响清单的实施?
它是合法/可移植的代码吗?
c - _Alignof 与变长数组类型的操作数:标准有矛盾吗?
C2x,6.5.3.4 sizeof 和 _Alignof 运算符,语义,2(已添加重点):
如果操作数的类型是变长数组类型,则计算操作数;否则,不计算操作数,结果是一个整数常量。
C2x,6.7.6.2 数组声明符,语义,5(强调):
如果大小表达式是运算符操作数的一部分,则不计算
_Alignof
该表达式。
考虑这段代码:
问:应该f()
叫什么?
根据 6.5.3.4,操作数的类型是可变长度数组类型 => 计算操作数。
根据 6.7.6.2,大小表达式是_Alignof
运算符 => 不计算该表达式的操作数的一部分。
标准有矛盾吗?
如果不是,那么是否意味着 6.7.6.2 的优先级高于 6.5.3.4?
c - 为什么 C 没有 _Alignof 一元表达式?
一个简单的问题:为什么 C 没有_Alignof unary-expression
?
这是无效的 C11 代码:
注意:C++ 没有alignof unary-expression
. 这是无效的 C++ 代码:
UPD。但是,C 编译器和 C++ 编译器可能支持它作为扩展,同时产生以下诊断:
注意:C 的基本原理仅涵盖 C99,_Alignof
并已添加到 C11 中。
UPD2。
问:你会从这个功能中得到什么?
答:例如:能够查询使用对齐的数组对象的对齐方式_Alignas
。可以使用_Alignas
对齐说明符对齐数组对象。但是,没有(?)标准方法来查询此类数组对象的对齐方式。例子: