对齐和对齐的实际用例C++关键字
Practical use cases for alignof and alignas C++ keywords
我刚刚了解了alignof
和alignas
C++关键字,但我想不出开发人员想要使用这些关键字的任何实际案例。
有人知道这些关键字的任何实际用例吗?
alignas
说明符的一个常见用例是,您希望通过队列(例如,事件或任务队列(在不同线程之间传递多个对象,同时避免错误共享。错误共享是由于多个线程在实际访问不同的对象时竞争相同的缓存行而导致的。由于性能下降,这通常是不希望的。
例如,假设缓存行大小为64字节 – 给定以下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_;
};
这样,Event
对象将始终在缓存行边界上对齐,以便缓存行最多包含Event
对象。因此,在访问不同的Event
对象时,两个或多个线程永远不会竞争相同的缓存行(如果多个线程正在访问同一个Event
对象,它们显然会竞争相同的缓存行(。
根据我的经验,实际用例:
- 为嵌入式系统中的网络数据包编写专用分配器
- 解决嵌入式系统专用CPU中的错误
- 有关缓存使用情况的性能优化
- 将C++对象的一部分提供给 C 库,该库需要具体对齐
指针上的备用内存:如果指向某个类型的指针由于该类型的对齐而始终以零结尾,则这些始终为零的位可用于存储其他内容。例:
class Small { Aligned * ptr; bool b; }; // suppose having many instances
在 64 位架构上至少需要 8+1 字节,但可以通过仔细联合 PTR 和布尔值将其压缩为 8 字节。在使用 ptr 之前,您必须对其进行位屏蔽,但这是一个非常快速的指令。 它是内存和CPU之间的权衡。
相关文章:
- 如何理解将半精度指针转换为无符号长指针和相关的内存对齐
- 如何创建一个QTableWidgetItem,用长文本右对齐,左边有省略号
- 我可以检测和更改 gcc/g++ 中结构的当前数据对齐设置吗?
- 64位机器上的C++内存对齐
- 为什么我可以将变量存储在不是其最小对齐方式的倍数的地址?
- 使 std::vector 分配对齐内存的现代方法
- C++ cout 将双精度对齐到精度 2 并正确对齐
- 在 64 位边界上对齐C++结构数组?
- 使用 g++7 构建的代码在访问未对齐的内存时崩溃
- 在 capnp FlatArrayMessageReader 的对齐内存缓冲区中接收 zmq 消息
- 是否值得对齐变量?
- 初始化派生结构的基部分/意外打包派生结构字段以对齐基结构的间隙
- 对齐和对齐的实际用例C++关键字
- 如何减少代码的运行时间以对齐文本?
- 指向包含对齐 C 结构C++类的 C 指针的对齐问题
- Linux C++ 中的页面对齐内存分配
- C++ 类层次结构中的"对齐"是什么意思?
- 运行时错误:引用绑定到类型"int"的未对齐地址0xbebebebebebebec6,这需要 4 个字节对齐 (stl_vector.h)
- 具有调整对齐方式的类型定义
- 对于堆上的页面对齐内存分配是否有任何优化或不同的 API?