C++中如何以最简方式声明具备自定义对齐的嵌套向量(vector of vectors)
C++中如何以最简方式声明具备自定义对齐的嵌套向量(vector of vectors)
你想直接在模板参数里写alignas(64) vector<int>这种写法其实是行不通的,因为alignas是用来修饰类型实体或者变量的,没法直接嵌套在模板参数的类型声明里。不过有两种简洁的方法可以实现你的需求:
方法一:先定义对齐后的vector别名(推荐)
这是可读性最高的写法,先把带指定对齐的内层vector单独定义成一个类型别名,再用它声明外层vector:#include <vector> #include <cstddef> // 若使用硬件干扰对齐大小需要包含此头 // 定义对齐为64字节的vector<int>类型 using AlignedIntVec = alignas(64) std::vector<int>; // 要是想用硬件级别的干扰对齐,就改成: // using AlignedIntVec = alignas(std::hardware_destructive_interference_size) std::vector<int>; // 直接声明嵌套向量 std::vector<AlignedIntVec> my_vector;这种写法不仅简洁,而且一眼就能看懂每个部分的作用,日常开发用起来最顺手。
方法二:用decltype简化(无别名版)
要是不想多写一行别名,也可以用decltype来直接推导对齐后的类型,不过可读性会稍差一点:#include <vector> #include <cstddef> std::vector<decltype(alignas(64) std::vector<int>{})> my_vector; // 对应硬件干扰对齐的版本: // std::vector<decltype(alignas(std::hardware_destructive_interference_size) std::vector<int>{})> my_vector;
不管用哪种方法,最终实现的效果都是让每个内层std::vector的元数据(比如size、指向数据的指针这些核心字段)都按照你指定的字节数对齐,完全符合你的需求。
内容来源于stack exchange
相关产品推荐
相关产品推荐

