alignof 和 alignas C++ 关键字的实际用例

Beg*_*oob 3 c++ memory-alignment memory-layout c++11

我刚刚了解alignofalignasC ++的关键字,但我不敢去想如果开发者希望使用这些关键字的任何实际的案例。

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

眠りネ*_*ネロク 5

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

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

struct Event {
   int event_type_;
};
Run Code Online (Sandbox Code Playgroud)

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

std::queue<Event> eventQueue;
Run Code Online (Sandbox Code Playgroud)

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

struct alignas(64) Event {
   int event_type_;
};
Run Code Online (Sandbox Code Playgroud)

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