Я читал разные ответы о VLA на SO, но не нашел ответа. В моем случае у меня есть одна функция, которая выделяет память:
template<typename T>
void allocMemory(T *&data, const size_t numElems)
{
#ifdef PINNED_MEMORY
// allocate pinned memory
#else
data = new T[numElems];
#endif
}
Теперь у меня есть векторный класс, в котором я использую этот метод:
template<typename T>
class MyVec
{
T *data;
size_t size;
public:
MyVec(size_t _size): size(_size)
{ allocMemory<T>(data, size); } // gives VLA warning
};
Это происходит, когда я компилирую его с помощью компилятора nvcc (V0.2.1221), который, я думаю, использует компилятор gcc внизу (?). Фактическое предупреждение:
myvec.h:16:6: предупреждение: ISO C++ не поддерживает типы массивов переменной длины [-Wvla] data = new T[numElems];
allocMemory<T>(data, size)
? - person Marius   schedule 11.04.2014new T[num]
вообще не является массивом переменной длины. Если у вас естьint i; int j[i];
, вы называете это VLA. - person Klaus   schedule 11.04.2014