问题标签 [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 投票
2 回答
708 浏览

c++ - std::alignas 如何优化程序的性能?

在 32 位机器中,一个内存读取周期获取 4bytes个数据。
因此,对于读取缓冲区以下内容,读取下面提到的 128 个缓冲区需要 32 个读取周期bytes

现在,假设我已经按照下面提到的方式对齐了这个缓冲区,那么请告诉我它将如何使它更快地阅读?

我假设内存读取周期将仅保持 4 个字节。

0 投票
0 回答
216 浏览

c++ - alignas 说明符:关于类型/关于成员数据

以下两种情况在所有情况下都等效吗?

1)alignas关于类型

2)alignas在成员数组上

0 投票
1 回答
306 浏览

c++ - 内存对齐高于最大对齐 alignas malloc

将如何使用 malloc(或 new,因为在大多数实现中 new 是用 malloc 实现的,不确定标准对对齐和 new 的规定是什么,除了数据必须与最高标量对齐)与具有对齐要求设置为高于系统上的最大对齐要求 ( alignof(std::max_align_t))?所以像

0 投票
0 回答
846 浏览

c++11 - 为什么在带有 clang 的静态声明中使用 alignas 不编译?

我在 clang 上有一个编译错误,并在 gcc 中使用以下代码发出警告:

有谁知道为什么在包含 static 关键字的声明中不接受 alignas ?我将 --std=c++11 编译器选项与 gcc 和 clang 一起使用。(编辑:我使用了 clang 3.4 及更高版本和 gcc 4.8 及更高版本)

请注意,在使用 Visual Studio (CL 19 RC) 进行编译时,在这样的静态声明中使用 alignas 时不会出现错误。

0 投票
2 回答
474 浏览

c++ - `alignas(X)` 之前的预期主表达式?

我想测试使用alignas(),所以我写下这些代码:

但是,当我用 g++ 编译它时,编译器会输出一个错误:“expected primary-expression before alignas(X)”。谁能解释一下?我不知道alignas().

0 投票
1 回答
209 浏览

c++ - 我需要在 C++ 中对齐吗?

我相信我会的。由于对齐,矩阵库 Eigen3 可能比我自己的任何矩阵实现都快得多。

我最近开始研究使用 C++ 进行对齐。我偶然发现了 alignas 和 alignof 函数,并决定做一些测试。

我的第一个发现是结构的成员会自动对齐。我们以下面的结构为例:

并与这个比较:

我使用 alignas 而不是添加填充成员(char [7]),根据我的理解,这是等效的。

现在,两个结构的内存查看器显示如下:

第一个字节对应一个 char ('b')。使用 Mystruct 时,接下来的 7 个字节用something填充,最后 8 个字节代表双精度。使用 MyAlignedStruct 时,会发生非常相似的情况。sizeof() 函数为两个结构返回 16 个字节(我预计 MyStruct 为 9 个字节)。

所以我的第一个问题来了:如果编译器自己对齐,为什么我需要对齐?

我的第二个发现是 alignas(..) 并没有加快我的程序。我的实验如下。想象一下以下简单的结构:

如果我用该结构的实例填充一个向量,并假设第一个实例是 32 字节对齐的,那么每个结构将占用 24 个字节,并且字节序列将不再是 32 字节对齐的。老实说,我不确定如何通过对齐来提高速度,否则,我很可能不会在这里写。尽管如此,我还是使用了 alignas 来获得以下结构:

现在,Point 的连续实例将从 32 字节的倍数开始。我测试了这两个版本:在用结构实例填充一个巨大的向量后,我将所有双精度数相加并记录时间。我发现 32 字节对齐的结构和另一个之间没有区别。

所以我的第二个问题与我的第一个问题相同:为什么我需要对齐?

0 投票
1 回答
8429 浏览

c++ - gcc 过度对齐的新支持 (alignas)

我很难找到有关 GCC 的对齐新警告和 gcc -faligned-new 选项的更多信息。在 gcc 7.2.0 上编译(没有 --std=c++17)并尝试定义一个对齐的结构,例如:

只是做一个简单的旧:

给我以下警告和建议:

我知道默认情况下new只会返回对齐到alignof( std::max_align_t )(对我来说是 16)的内存,但我不清楚的是,如果我通过 -faligned-new,gcc 现在会new代表我强制执行正确的新对齐吗?

不幸的是,这方面的 gcc 文档非常缺乏。

0 投票
4 回答
729 浏览

c++ - 将 operator new(sizeof(T) * N) 返回的内存视为数组

在 C 中,可以使用然后使用指针算法来分配动态数组malloc(sizeof(T) * N),然后使用指针算法来获取此动态数组中 i 偏移处的元素。

在 C++ 中,可以operator new()以与相同的方式使用malloc(),然后放置 new(例如,可以在 Herb Sutter 的“Exceptional C++:47 个工程难题、编程问题和解决方案”一书中查看第 13 项的解决方案)。如果您没有,则此问题的解决方案摘要将是:

对我来说,这看起来是合法的,因为我要求一块具有足够内存的内存来保存大小 = 的 N 个对齐元素sizeof(T)。由于sizeof(T)应该返回对齐的元素大小,并且它们一个接一个地放置在一块内存中,因此在这里使用指针算法是可以的。

但是,然后我被指向如下链接:http://eel.is/c++draft/expr.add#4http://eel.is/c++draft/intro.object#def:object并声称在 C++operator new()中,它不返回数组对象,因此与 ANSI C 相比,它返回​​的内容并将其用作数组的指针算术是未定义的行为。

我不擅长这么低级的东西,我真的想通过阅读以下内容来理解:https ://www.ibm.com/developerworks/library/pa-dalign/或者这个:http://jrruethe。 github.io/blog/2015/08/23/placement-new/但我仍然无法理解 Sutter 是否完全错了?

我确实明白这alignas在以下结构中是有意义的:

(c) http://georgeflanagin.com/alignas.php

如果数组似乎不在边界中double(可能跟随char在 2 字节读取处理器上运行的结构中)。

但这是不同的——我已经从堆/空闲存储中请求了内存,特别是请求 operator new 返回内存,它将保持元素对齐到sizeof(T).

总结一下,如果这是 TL;DR:

  • 是否可以malloc()在 C++ 中用于动态数组?
  • operator new()是否可以在没有alignas关键字的旧 C++ 中使用和放置新的动态数组?
  • 在返回的内存上使用指针算术是否未定义行为operator new()
  • Sutter 是否建议可能在某些古董机器上破坏的代码?

对不起,如果这是愚蠢的。

0 投票
1 回答
88 浏览

c++ - 对齐究竟如何影响内存布局和放置新的行为?

我们阅读了很多关于对齐及其重要性的文章,例如对于放置的new使用,但我想知道 - 它究竟如何改变内存的布局?

显然,如果我们这样做

我们得到相同的结果,即10.

但是行为不可能完全相同,不是吗?怎么区分的?我试图寻找答案并跑到godbolt,测试以下代码:

在 GCC 8.2 和没有优化的情况下,会导致以下程序集:

让我们通过删除部分来稍微更改代码alignas(int)。现在,生成的程序集略有不同:

值得注意的是,它仅在lea指令上有所不同,其中第二个参数是[rbp-10]而不是[rbp-12],就像我们在alignas(int)版本中所做的那样。

请注意,我通常不懂汇编。我不能写汇编,但我能读懂它。据我了解,差异只是改变了内存地址的偏移量,它将保存我们的new放置int

但它实现了什么?为什么我们需要那个?假设我们有一个buffer数组的“通用”表示,如下所示:

现在,我假设,在放置(有或没有对齐)之后,我们最终会得到这样的结果newint

其中x表示 an 的单个字节int(我们假设sizeof(int) == 4)。

但我一定是错过了什么。还有更多,我不知道是什么。buffer通过对齐到int合适的对齐方式,我们到底能实现什么?如果我们不这样对齐会发生什么?

0 投票
1 回答
301 浏览

c++ - 如何创建 char/std::byte 的 std::vector,其中第一个字节与 16 个字节对齐,但没有填充?

有一个现有的问题需要 C++03 并且没有答案,所以我将打开一个新问题。

我遇到的问题是我想要std::vectorof std::byte,但是.data()(数据数组的第一个元素)是 16 字节对齐的。

alignason Wrapped char 没有帮助,因为我不想在数组中有对齐间隙。换句话说,我想将元素对齐为 1,但我希望数组对齐为 16。

理想情况下,我想避免使用自定义分配器。如果有任何 TBB 或增强向量可以满足我的要求,那也很棒。