问题标签 [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.
c++ - std::alignas 如何优化程序的性能?
在 32 位机器中,一个内存读取周期获取 4bytes
个数据。
因此,对于读取缓冲区以下内容,读取下面提到的 128 个缓冲区需要 32 个读取周期bytes
。
现在,假设我已经按照下面提到的方式对齐了这个缓冲区,那么请告诉我它将如何使它更快地阅读?
我假设内存读取周期将仅保持 4 个字节。
c++ - alignas 说明符:关于类型/关于成员数据
以下两种情况在所有情况下都等效吗?
1)alignas
关于类型
2)alignas
在成员数组上
c++ - 内存对齐高于最大对齐 alignas malloc
将如何使用 malloc(或 new,因为在大多数实现中 new 是用 malloc 实现的,不确定标准对对齐和 new 的规定是什么,除了数据必须与最高标量对齐)与具有对齐要求设置为高于系统上的最大对齐要求 ( alignof(std::max_align_t)
)?所以像
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 时不会出现错误。
c++ - `alignas(X)` 之前的预期主表达式?
我想测试使用alignas()
,所以我写下这些代码:
但是,当我用 g++ 编译它时,编译器会输出一个错误:“expected primary-expression before alignas(X)
”。谁能解释一下?我不知道alignas()
.
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 字节对齐的结构和另一个之间没有区别。
所以我的第二个问题与我的第一个问题相同:为什么我需要对齐?
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 文档非常缺乏。
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#4或http://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 是否建议可能在某些古董机器上破坏的代码?
对不起,如果这是愚蠢的。
c++ - 对齐究竟如何影响内存布局和放置新的行为?
我们阅读了很多关于对齐及其重要性的文章,例如对于放置的new
使用,但我想知道 - 它究竟如何改变内存的布局?
显然,如果我们这样做
和
我们得到相同的结果,即10
.
但是行为不可能完全相同,不是吗?怎么区分的?我试图寻找答案并跑到godbolt,测试以下代码:
在 GCC 8.2 和没有优化的情况下,会导致以下程序集:
让我们通过删除部分来稍微更改代码alignas(int)
。现在,生成的程序集略有不同:
值得注意的是,它仅在lea
指令上有所不同,其中第二个参数是[rbp-10]
而不是[rbp-12]
,就像我们在alignas(int)
版本中所做的那样。
请注意,我通常不懂汇编。我不能写汇编,但我能读懂它。据我了解,差异只是改变了内存地址的偏移量,它将保存我们的new
放置int
。
但它实现了什么?为什么我们需要那个?假设我们有一个buffer
数组的“通用”表示,如下所示:
现在,我假设,在放置(有或没有对齐)之后,我们最终会得到这样的结果new
:int
其中x
表示 an 的单个字节int
(我们假设sizeof(int) == 4
)。
但我一定是错过了什么。还有更多,我不知道是什么。buffer
通过对齐到int
合适的对齐方式,我们到底能实现什么?如果我们不这样对齐会发生什么?
c++ - 如何创建 char/std::byte 的 std::vector,其中第一个字节与 16 个字节对齐,但没有填充?
有一个现有的问题需要 C++03 并且没有答案,所以我将打开一个新问题。
我遇到的问题是我想要std::vector
of std::byte
,但是.data()
(数据数组的第一个元素)是 16 字节对齐的。
alignas
on Wrapped char 没有帮助,因为我不想在数组中有对齐间隙。换句话说,我想将元素对齐为 1,但我希望数组对齐为 16。
理想情况下,我想避免使用自定义分配器。如果有任何 TBB 或增强向量可以满足我的要求,那也很棒。