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

C++ C++;对齐(何时使用alignas),c++,struct,alignment,C++,Struct,Alignment,我最近学习了结构的大小和对齐。我非常熟悉如何使用alignas()说明符以及它的工作原理。我已经看到了正确使用的例子(关于语义,而不是真实的用例)以及它改变类型/变量大小的方式 但是,我不知道它在我的代码中何时有用。当开发人员应该手动指定数据对齐时,您能列出一些用例吗 在很多情况下,alignas在对延迟敏感的多线程应用程序中非常方便。高频交易应用 Alignas对对象在CPU缓存上的布局提供了更严格的控制,以加快对对象的访问。优化使用的目标如下,这是使用alignas的用例 您希望避免缓存线中

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


但是,我不知道它在我的代码中何时有用。当开发人员应该手动指定数据对齐时,您能列出一些用例吗

在很多情况下,alignas在对延迟敏感的多线程应用程序中非常方便。高频交易应用

Alignas对对象在CPU缓存上的布局提供了更严格的控制,以加快对对象的访问。优化使用的目标如下,这是使用alignas的用例

  • 您希望避免缓存线中的数据发生不必要的无效
  • 您希望优化CPU读取,以节省CPU周期的浪费 使用alignas对齐缓存线有什么帮助
    使用1-避免缓存线中的数据不必要的失效 您可以使用alignas保持在单独缓存线上运行的单独线程使用的地址或对象,这样一个线程不会无意中使另一个核心的缓存线无效

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

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

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

    缓存线1字节------->
    缓存线2
    缓存线3

    由于CPU读取多条缓存线,因此对象将在3个CPU周期内读取。如果你想优化它,请考虑Alcas(64)。这样,对象将始终分布在两条缓存线上

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


    希望这对你有帮助,祝你好运

    与期望一定对齐的设备交谈;使用SSE/MMX/etc;利用CPU功能,当数据以某种方式对齐时,这些功能可以更快地工作——例如,确保给定的“char s[128]”不会在两条CPU缓存线之间分割(您获得了我的“最佳答案”奖)