【发布时间】:2017-01-16 12:19:54
【问题描述】:
我使用__m256 作为模板类的参数(参见下面的代码)。在Ubuntu 16.10 (Yakkety Yak) 上使用 g++ 6.2 版进行编译时,它会警告我模板参数上的属性被忽略:
警告:忽略模板参数“__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);
}
【问题讨论】: