我正在尝试创建一个链表模板,它适用于用户定义的类型,但对于基本类型,如gcc和clang的int行为不同.
template<class T>
struct Node {
Node* next;
T val;
};
template<class T, class... Args>
Node<T> create(Args... args) {
return {nullptr, {args...}};
}
int main() {
create<int>(0);
}
Run Code Online (Sandbox Code Playgroud)
虽然clang编译代码没有问题,但gcc会生成以下错误消息.
错误:无法将'{nullptr,{args#0}}'从'<brace-enclosed initializer list>'转换为'Node <int>'
虽然我知道如何解决这个问题,但我仍然感兴趣的是clang是否过于宽松,我不能依赖这段代码的可移植性,或者它是一个gcc bug,应该在某个时候解决.
根据https://sourceware.org/glibc/wiki/libmvec GCC 具有数学函数的矢量实现。它们可以被编译器用于优化,可以在这个例子中看到: https: //godbolt.org/g/IcxtVi,编译器使用一些损坏的正弦函数并一次对 4 个双精度数进行操作
我知道如果我需要数学函数,可以使用 SIMD 数学库,但我仍然感兴趣是否有一种方法可以使用__m256d某种内在函数或任何其他方式手动调用 GCC 中已经存在的向量化数学函数?