问题标签 [alignas]

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 投票
0 回答
65 浏览

c++ - Alignment of Member Array in Class not Working

I use the following to 16-byte align a 4 element float array in a class

The variable is not aligned. Why is that? My assumption would be that the alignment depends on the alignment of the instance of Foo since the internal offset of member variables is static and not adjusted on runtime. Is that correct or am I missing something? Thus one thing to fix it would be to align Foo with something >=16 so that the internal offsets are fixed?

0 投票
0 回答
55 浏览

arrays - 对齐结构的阵列,可诱导单个成员的规则阵列

如果我有一个结构(例如employee下面),只有当结构的大小是所有成员大小的(最小)公倍数(LCM)时,这种结构的数组才会引发结构的所有成员的跨步数组。

否则,将有指向数组中特定成员实例的指针,它们没有整数指针距离(以成员类的大小衡量)。

因此,例如,给定这个结构:

A std::vector<employee> v(或employee[N]就此而言的数组)诱导成员的跨步数组salary(使用 stride sizeof(employee)/sizeof(short))以及 的跨步数组age

也就是说,工资数组是由 随机访问的&(v.data()->salary) + sizeof(employee)/sizeof(short)* n

但是,它不会引起名称的跨步数组,因为sizeof(employee)(=48) 不是sizeof(std::string)(32) 的倍数(在我的系统中)。

当然,我可以以其他方式定义结构以允许这样做:

我想知道找到这个正确的alignas论点是否是实现这一目标的唯一方法。此外,如果有一种自动获取该数字的方法,而无需手动查找公倍数。

我似乎没有反思的最一般的方法是做这样的事情:

也就是说,我必须提前枚举所有成员。我可以constexpr std::lcm通过链接它多次使用)。

这是正确的方法吗?

此外,人们总是可以找到这种甚至不起作用的病态情况,因为存在额外的限制,即对齐需要是 2 的幂(在某些系统中)。在这种情况下,公倍数也需要是 2 的幂,并且可以是一个巨大的数字:

...error: requested alignment ‘3296’ is not a positive power of 2

为了使对齐 LCM 起作用,我必须手动更改特定成员的对齐方式或将constexpr上限添加到最接近的 2 次幂。

但是,这仍然不能解决问题,因为alignas它不是 的一部分password_type,似乎唯一的解决方案是拥有一个std::array也需要内部对齐参数的版本!std::aligned_array<char, 103, 128>.

好的,我仍然可以这样做,但代价是修改employee最初未耦合的其他类。

它可能最终会起作用。但这需要大量的手动工作,并且可能会在我更改系统或添加新成员等时更改。

有没有更自动的方法来做到这一点?或遵循一些约定以使这个问题不那么痛苦

0 投票
1 回答
256 浏览

c++ - 对齐/偏移结构的特定成员

在结构内对齐成员的最佳或常规方法是什么? 添加虚拟数组是最好的解决方案吗?

我有一个结构double和一个三元组double

如果我有这些数组,内存将如下所示

问题是从第一个三元组到第二个三元组的距离不是 的整数倍sizeof(std::tuple<double, double,double>)==3*sizeof(double),因此我不能将交错的三元组数组解释为 strides 的数组

换句话说,给定一个粒子数组particle ps[100],我可以将成员的地址带到第一个元素triple* v1P = &(ps[0].position),并且我想要一些v1P + n == &(ps[1].position)(整数)(我可以在编译时推断,例如if 。)nn = sizeof(particle)/sizeof(tripe)sizeof(particle)%sizeof(tripe)==0

强制三元组具有不同偏移量的最佳方法是什么?

我可以在中间粘贴一些人工doubles 以匹配偏移量:

所以内存看起来像这样

但是我不能使用初始化程序(particle{1.,{1.,2.,3.}})。

我也可以把它加到最后

所以,我可以继续使用初始化程序。这是最好的方法吗?但它只适用于这种简单的情况。

另一种选择可能是强制对齐struct到某个倍数3*sizeof(double)

但问题是它不是 2 的幂,所以 GCC 和 clang 拒绝它。请注意,在其他大小的元组中,该alignas策略有效,因为它可以解决意外为 2 的幂的问题。

例如在

alignas为这个其他用例(在 GCC 中)提供了一个简单的解决方案。

对此有通用或公认的解决方案吗?

我还发现了((packed)),在这个解决方案中也有必要吗?


我发现这篇旧文章https://www.embedded.com/design/prototyping-and-development/4008281/2/Padding-and-rearranging-structure-membershttps://web.archive.org/web/20190101225513 /http://www.drdobbs.com/cpp/padding-and-rearranging-structure-member/240007649。至少在当时,在中间添加数组似乎是一种解决方案。此外,我可以使用char[N]这种方式进行更精细的控制,达到一个字节的级别。

0 投票
1 回答
66 浏览

c++ - 断言结构类型是用 alignas() 声明的

正如标题所述,我需要某种方式来断言已使用 alignas 声明了一个类型:

它旨在用于模板参数,其中模板类需要确保其模板化的类型是 16 字节对齐的。

0 投票
1 回答
108 浏览

c++ - 在对 2 条短裤的过度对齐结构进行比较时,gcc 是否错过了优化机会?

我想知道 GCC 是否会使用我创建的结构过度对齐的知识,并在生成比较 asm 时将其简单地视为一个整数。

它不是。我想知道这是否是由于 ABI 问题,我错过了其他一些因素,还是真的缺少优化?

螺栓链接

代码:

0 投票
1 回答
137 浏览

malloc - 常量缓冲区的alignas_malloc() vs alignas()

在 C++ 中,我们有关键字alignas(n)_aligned_malloc(m,n)函数。
alignas适用于类型,同时aligned_malloc适用于您所称的任何类型。
我可以用它alignas(16)来满足 Direct3D 常量缓冲区的 16 字节对齐要求吗?

0 投票
1 回答
154 浏览

c++ - alignas() 对 sizeof() 的影响 - 强制性的?

这个程序:

返回 4,使用 GCC 10.1 和 clang 10.1,以及 icc 19.0.1。

这让我想知道 -以这种方式alignas()影响是强制性的吗?sizeof()即增加超出结构最初大小的大小?或者 - 这种变化只是实施的特权吗?

0 投票
0 回答
64 浏览

c++11 - 对齐一个简单的类以允许在没有 UB 的情况下访问数组

假设我有以下简单的类:

由于我希望对员工数组中的员工成员进行类似数组的访问name,因此我需要例如偏移量是可分割的:

为了确保我使用的是alignas指令:

这似乎可以完成这项工作(现在static_assert上述通过了)。

但是,当我打开clangUB(未定义的行为清理程序)并尝试构建该对齐版本的类 clang 的数组时,检测到错误:

那么让alignment员工和name成员兼容的正确方法是什么?(所以数组的成员可以通过指针std::string*算术访问)

奖励问题:如何对齐所有成员以允许对employees 数组的所有成员进行数组访问。

有关更多详细信息,请参见此处:对齐/偏移结构的特定成员

基本上,我注意到根据 clang 有效的解决方案是 UB,我正在寻找替代方案。


通过成员的数组访问,我的意思是能够做到这一点:


请注意,我发现这很有效(在我的系统中),工作是否匹配步幅,而 clang 并没有说是 UB:

这是迄今为止我发现的唯一不产生 UB 的选项。我想知道是否还有更好的方法。

最惯用的路径似乎使用alignas但它也根据clang触发UB。

0 投票
1 回答
103 浏览

c++ - 通过模板的 C++ 类说明符 alignas 选项

可以使用 C++ 模板参数来控制类本身的说明符以最小化一些代码重复吗?

例如:我有一个类,我想在带有说明alignas符的并发上下文(和容器)中使用,也想在没有说明符的单线程上下文中使用它alignas。类的大小很小(20B)——小于一个高速缓存行。我确实需要在两个班级之间进行复制。现在我已经复制了两个类的两个定义的代码,除了上述说明符之外,它们大部分是相同的。模板或其他方式可以允许一个定义,一个有alignas一个没有?

0 投票
1 回答
28 浏览

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 中进行对齐的帮助将不胜感激。