Beg*_*oob 3 c++ memory-alignment memory-layout c++11
我刚刚了解alignof和alignasC ++的关键字,但我不敢去想如果开发者希望使用这些关键字的任何实际的案例。
有人知道这些关键字的任何实际用例吗?
alignas说明符的一个常见用例是您希望通过队列(例如,事件或任务队列)在不同线程之间传递多个对象同时避免错误共享的场景。当多个线程实际访问不同的对象时,它们会竞争同一个缓存行,从而导致错误共享。由于性能下降,这通常是不可取的。
例如——假设缓存行大小为64字节——给定以下Event类:
struct Event {
int event_type_;
};
Run Code Online (Sandbox Code Playgroud)
的对齐方式Event将对应于其数据成员 的对齐方式event_type_。假设 的对齐int是4个字节(即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对象,它们显然会竞争同一个缓存行)。