我刚学习了C++中的alignof
和alignas
关键字,但是我无法想象开发人员何时需要使用这些关键字。
请问有没有人知道这些关键字的实际用途?
我刚学习了C++中的alignof
和alignas
关键字,但是我无法想象开发人员何时需要使用这些关键字。
请问有没有人知道这些关键字的实际用途?
alignas
说明符的常见用法是在通过队列(例如事件或任务队列)在不同线程之间传递多个对象时避免伪共享。当多个线程实际上访问不同的对象时,它们会竞争相同的缓存行,从而导致伪共享。由于性能下降,通常不希望出现这种情况。Event
类:struct Event {
int event_type_;
};
Event
的对齐方式将与其数据成员event_type_
的对齐方式相对应。假设int
的对齐方式为4字节(即alignof(int)
计算结果为4),则最多可以将16个Event
对象放入单个高速缓存行中。因此,如果您有一个类似于以下队列:
std::queue<Event> eventQueue;
当一个线程将事件推入队列的后面,另一个线程从前面拉取事件时,它们可能会竞争相同的缓存行。然而,通过在 Event
上正确使用 alignas
指定符:
struct alignas(64) Event {
int event_type_;
};
基于我的经验,以下是一些实际应用场景:
指针上的备用内存:如果指向某个类型的指针总是以零结尾,因为该类型的对齐方式,则始终为零的位可以用于存储其他内容。例如:
class Small { Aligned * ptr; bool b; }; // suppose having many instances
memcpy
分配到它们来对它们进行分配。这不能允许修改任何其他对象的值,包括b
。但如果它们共享内存,那么就会出现这种情况。填充字节是对象表示的一部分,因此不能随意被某个其他对象使用(除非该对象大小为零)。 - Nicol Bolas