C++ 对齐(何时使用 alignas)

标签 c++ struct alignment

我最近了解了结构的大小和对齐方式。我非常熟悉 alignas() 说明符的使用方法和工作原理。我已经看到了正确使用的例子(关于语义,而不是现实生活中的用例)以及它改变类型/变量大小的方式。

但是,我不知道什么时候它在我的代码中有用。当开发人员应手动指定数据对齐方式时,您能否列出一些用例?

最佳答案

有很多用例表明 alignas 在对延迟敏感的多线程应用程序中很方便。例如。高频交易应用。

Alignas 可以更严格地控​​制对象在 CPU 缓存上的布局方式,从而更快地访问对象。最佳使用目标如下,即使用 alignas 的用例

  1. 您想避免缓存行中的数据不必要地失效
  2. 您想优化 CPU 读取,从而避免浪费 CPU 周期。

使用 alignas 对齐缓存行有何帮助
使用 1 - 避免不必要的缓存行数据无效 您可以使用 alignas 来保持在单独的缓存行上运行的单独线程使用的地址或对象,这样一个线程就不会无意中使另一个核心的缓存行无效。

这是如何发生的: 考虑当您的进程中的线程在核心 0 上运行并且正在写入地址 xxxx 时的情况。该地址现在被加载到核心 0 的 L1 缓存中。 线程号2 正在访问地址 xxxx + n 字节。现在,如果这两个地址碰巧在同一个缓存行上,那么线程 2 的任何写入都将不必要地使核心 0 的缓存行无效。因此线程 0 会延迟,直到缓存行无效并再次加载。这会影响多线程环境中的性能。

使用 2 将您的对象对齐到单独的缓存行,这样对象就不会分布在多个缓存行中。这节省了 CPU 周期。例如。如果您的对象大小是例如。 118 字节,最好将其对齐到 64 字节,因为在大多数处理器上,缓存行大小现在是 64 字节。

如果您不这样做,您的对象可能会在 64 字节缓存行上按如下方式布局。 (例如,对象的实际大小为 118 字节,自然对齐后,大小变为 4 的倍数,因此为 120 字节)

Cache line 1<-----Object 1 60Bytes --> <---your Object 4> Bytes ---------->
Cache line 2<--------- Your object 64 Bytes --------------------------------->
Cache line 3 <----- Your object 52 bytes -----> <--- Some other object 12 Bytes -->

由于 CPU 读取多个缓存行,您的对象将在 3 个 cpu 周期内读取。如果你想优化它,请考虑 alignas(64)。这样,您的对象将始终分布在 2 个缓存行上。

注意事项 请注意,在考虑 alignas 之前,您需要仔细检查您的元素。原因是错误的方法会导致更多的填充,从而导致更多的 L2 缓存浪费。有一些简单的技术可以按顺序排列数据成员,从而避免浪费。

希望这对您有所帮助,祝您好运!

关于C++ 对齐(何时使用 alignas),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45478824/

相关文章:

jquery - Html/Css 在一个 div 中垂直居中一个 div

html - 使用 HTML 对齐和对齐文本

css - 列表导航中的垂直对齐伪元素

c++ - Scons:如何在编译前使用不产生任何输出文件的命令检查文件?

c++ - 堆上有大对象不好吗?

c++ - 对 c 结构进行排序

C++ 成员函数

c - 使用 qsort 函数对结构进行排序

c++ - OpenGL "black screen"挫折

java - C++ 类中的内部代理实现