对齐和对齐的实际用例C++关键字

Practical use cases for alignof and alignas C++ keywords

本文关键字:对齐 C++ 关键字      更新时间:2023-10-16

我刚刚了解了alignofalignasC++关键字,但我想不出开发人员想要使用这些关键字的任何实际案例。

有人知道这些关键字的任何实际用例吗?

alignas说明符的一个常见用例是,您希望通过队列(例如,事件或任务队列(在不同线程之间传递多个对象,同时避免错误共享。错误共享是由于多个线程在实际访问不同的对象时竞争相同的缓存行而导致的。由于性能下降,这通常是不希望的。

例如,假设缓存行大小为64字节 – 给定以下Event类:

struct Event {
int event_type_;
};

Event的对齐方式将对应于其数据成员的对齐方式,event_type_。假设int的对齐方式为 4 个字节(即,alignof(int)计算结果为4(,那么单个缓存行最多可以容纳16Event对象。因此,如果您有这样的队列:

std::queue<Event> eventQueue;

如果一个线程将事件推送到队列的后面,另一个线程从前面拉取事件,我们可能会让两个线程竞争相同的缓存行。但是,通过在Event上正确使用alignas说明符:

struct alignas(64) Event {
int event_type_;
};

这样,Event对象将始终在缓存行边界上对齐,以便缓存行最多包含Event对象。因此,在访问不同的Event对象时,两个或多个线程永远不会竞争相同的缓存行(如果多个线程正在访问同一个Event对象,它们显然会竞争相同的缓存行(。

根据我的经验,实际用例:

  • 为嵌入式系统中的网络数据包编写专用分配器
  • 解决嵌入式系统专用CPU中的错误
  • 有关缓存使用情况的性能优化
  • 将C++对象的一部分提供给 C 库,该库需要具体对齐

指针上的备用内存:如果指向某个类型的指针由于该类型的对齐而始终以零结尾,则这些始终为零的位可用于存储其他内容。例:

class Small { Aligned * ptr; bool b; }; // suppose having many instances

在 64 位架构上至少需要 8+1 字节,但可以通过仔细联合 PTR 和布尔值将其压缩为 8 字节。在使用 ptr 之前,您必须对其进行位屏蔽,但这是一个非常快速的指令。 它是内存和CPU之间的权衡。