GCC警告的含义:忽略模板参数上的属性(-Wignored属性)
Implication of GCC warning: ignoring attributes on template argument (-Wignored-attributes)
我使用__m256
作为模板类的参数(请参阅下面的代码)。在Ubuntu上使用g++6.2版进行编译时;16.10(Yakkey Yak),它警告我模板参数中的属性被忽略:
警告:忽略模板参数"__m256{aka __vector(8)float}"[-Wignored attributes]typedef vec_array<__m256>vec256
__m256
类型似乎有一些关于对齐的属性(也许还有其他一些?)。下面显示的这个基元容器类(它生成警告)的唯一目的是处理堆上这些特殊Intel变量(__m256
、__m128
等)的内存对齐
当我在整个程序中使用这个容器类时,它似乎工作得很好。然而,我的问题是,当GCC忽略这些属性时,会产生什么影响(我已经阅读了GCC手册中关于这个问题的内容)。
- 有什么好方法可以消除这些警告吗
- 我必须为此担心吗
- 如果我忽视这个警告,最糟糕的情况是什么
为了参考,下面的代码会产生此警告。
///////////////////////////////////////////////////////////////////////////////
// System includes:
#include <x86intrin.h>
#include <cstdint>
static const size_t AVX_alignment = 32;
template<typename VecT>
class vec_array
{
protected:
VecT* m_pdata;
size_t m_num_vector_elements;
public:
vec_array();
vec_array(size_t num_vector_elements);
virtual ~vec_array();
void allocate(size_t num_vector_elements);
void free();
};
template<typename VecT>
vec_array<VecT>::vec_array() : m_pdata(nullptr), m_num_vector_elements(0)
{}
template<typename VecT>
vec_array<VecT>::vec_array(size_t num_vector_elements) : m_pdata(nullptr),
m_num_vector_elements(num_vector_elements)
{
allocate(num_vector_elements);
}
template<typename VecT>
vec_array<VecT>::~vec_array()
{
free();
}
template<typename VecT>
void vec_array<VecT>::allocate(size_t num_vector_elements)
{
if( m_num_vector_elements == num_vector_elements)
return;
m_num_vector_elements = num_vector_elements;
free();
m_pdata = reinterpret_cast<VecT*>(_mm_malloc(m_num_vector_elements*sizeof(VecT), AVX_alignment));
}
template<typename VecT>
void vec_array<VecT>::free()
{
if(m_pdata != nullptr)
_mm_free(m_pdata);
}
typedef vec_array<__m256> vec256;
int main()
{
vec256 test_vec(10);
}
我在一些OpenCL代码中遇到了同样的警告,并在这里结束了,没有先看代码。你可以在制作std::vector分配对齐内存中看到一些人试图避免这个警告,但在我看来这是不值得的。
简单的答案是,除了只支持128位AVX指令的CPU之外,您不必担心这一点。如果警告是严重的,那么CPU将在未对齐的访问上生成异常。
出现此警告的原因是,类型__m256
可能是用可能为16字节的对齐说明符声明的。也就是说,CPU将期望向量的每个元素的对齐为16字节。但是,矢量的模板不支持对齐属性。
我认为你必须做一些愚蠢的事情,比如
struct stupidStruct __attribute__(packed) {
unsigned short padding;
std::vector<__m256> vect;
};
以强制编译器生成会导致错误的代码。
可以通过使用以下结构包装向量类型(如__m256
)来消除这些警告:
struct __m256_wrapper {
typedef __m256 VecT;
};
并在需要的地方使用该结构作为模板参数。因此,您提供的代码将更改如下:
///////////////////////////////////////////////////////////////////////////////
// System includes:
#include <x86intrin.h>
#include <cstdint>
static const size_t AVX_alignment = 32;
struct __m256_wrapper {
typedef __m256 VecT;
};
template<typename W>
class vec_array
{
protected:
typename W::VecT* m_pdata;
size_t m_num_vector_elements;
public:
vec_array();
vec_array(size_t num_vector_elements);
virtual ~vec_array();
void allocate(size_t num_vector_elements);
void free();
};
template<typename W>
vec_array<W>::vec_array() : m_pdata(nullptr), m_num_vector_elements(0)
{}
template<typename W>
vec_array<W>::vec_array(size_t num_vector_elements) : m_pdata(nullptr),
m_num_vector_elements(num_vector_elements)
{
allocate(num_vector_elements);
}
template<typename W>
vec_array<W>::~vec_array()
{
free();
}
template<typename W>
void vec_array<W>::allocate(size_t num_vector_elements)
{
if( m_num_vector_elements == num_vector_elements)
return;
m_num_vector_elements = num_vector_elements;
free();
m_pdata = reinterpret_cast<typename W::VecT*>(_mm_malloc(m_num_vector_elements*sizeof(typename W::VecT), AVX_alignment));
}
template<typename W>
void vec_array<W>::free()
{
if(m_pdata != nullptr)
_mm_free(m_pdata);
}
typedef vec_array<__m256_wrapper> vec256;
int main()
{
vec256 test_vec(10);
}
- 主函数参数的属性
- C++ 命名参数习惯用语 - 未设置字符串属性
- c++ 构造函数 将 1 个字符串参数转换为 3 个属性
- 警告:忽略模板参数上的属性..在 std::unique_ptr (-wignore 属性)的声明中
- CMake 设置使用不正确的参数数调用的目标属性
- 在C++中使用参数包作为类属性是否可能和/或良好的实践
- 修改"参数视图属性"面板 (5.7.0) 上的默认属性
- 使用类属性调用具有非类型模板参数的模板函数
- 变量作为 C++11 属性参数
- 可以 main() 及其参数具有属性
- 可以将属性应用于构造函数参数
- 对于属性上的 NOTIFY 信号,如果我给它一个参数有什么区别?
- 存储模板参数包作为非类模板的属性
- 使用dllimport属性导入的函数参数
- X11 XGetImage badmatch错误(无效的参数属性)
- 用于指示返回值生存期的C++函数属性和参数相同
- GCC警告的含义:忽略模板参数上的属性(-Wignored属性)
- 有没有办法将别名模板推导到模板模板参数,同时仍保留其被推导上下文的属性
- 如何将 GCC 的 printf 格式属性与 C++11 可变参数模板一起使用?
- 参数类的属性