Clang使用别名模板时忽略__attribute__((aligned))属性问题问询
Clang忽略模板类型别名的
__attribute__((aligned))属性的问题及解决方案 问题概述
编写SIMD代码时,尝试通过模板类型别名生成具备特定对齐属性的类型,发现Clang会忽略模板别名上的__attribute__((aligned))属性,但非模板的类型别名可正常应用该属性。
示例代码
#include <iostream> #include <cstdint> template <typename T=void> using TemplatedT __attribute__((aligned(8))) = uint32_t; using ManualT __attribute__((aligned(8))) = uint32_t; int main() { std::cout << "alignof Template: " << alignof(TemplatedT<>) << std::endl; std::cout << "alignof Manual: " << alignof(ManualT) << std::endl; }
编译器表现差异
- GCC 12.2:两个类型别名的对齐值均为8,符合预期。
- Clang 15及主干版本:模板别名
TemplatedT<>的对齐值为4,完全忽略了指定的对齐属性;非模板别名ManualT的对齐值为8,表现正常。
是否为Bug
这属于Clang的实现问题,目前已在LLVM项目提交相关Issue(编号59788)。GCC的处理符合预期,说明标准允许为模板类型别名添加对齐属性,Clang的行为不符合预期。
可行替代方案
可以通过包装结构体的方式绕开这个问题,示例代码如下:
template<typename ScalarT> struct Vec { using T __attribute__((aligned(8))) = ScalarT; }; // 使用方式:Vec<uint32_t>::T
内容的提问来源于stack exchange,提问作者Richard E
相关产品推荐
相关产品推荐

