Предупреждения массива переменной длины (VLA) C++

Я читал разные ответы о 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];


person usman    schedule 11.04.2014    source источник
comment
ты пробовал allocMemory<T>(data, size) ?   -  person Marius    schedule 11.04.2014
comment
Какое фактическое сообщение об ошибке вы получаете?   -  person Sean    schedule 11.04.2014
comment
@Мариус ой. да, это allocMemory‹T›(данные, размер) в исходном коде.   -  person usman    schedule 11.04.2014
comment
new T[num] вообще не является массивом переменной длины. Если у вас есть int i; int j[i];, вы называете это VLA.   -  person Klaus    schedule 11.04.2014
comment
Если это скомпилировано с NVCC, убедитесь, что ошибка не где-то еще, или что у вас где-то есть макрос CUDACC, так что вы действительно компилируете какую-то другую часть coe.   -  person Marco A.    schedule 11.04.2014
comment
Нет предупреждения здесь... можете ли вы привести пример, который действительно вызывает предупреждение? Какой компилятор вы используете? Какая версия? Какая платформа?   -  person Massa    schedule 12.04.2014


Ответы (1)


Я думаю, что вы не правильно компилируете свой проект.

Попробуйте использовать текущий файл make.

CUDA_INSTALL_PATH: = /usr/local/cuda

CXX := g++
CC := gcc
LINK := g++ -fPIC
NVCC  := nvcc

 #Includes

INCLUDES = -I. -I$(CUDA_INSTALL_PATH)/include

 #Common flags

COMMONFLAGS += $(INCLUDES)
NVCCFLAGS += $(COMMONFLAGS)
CXXFLAGS += $(COMMONFLAGS)
CFLAGS += $(COMMONFLAGS)

LIB_CUDA := -L$(CUDA_INSTALL_PATH)/lib -lcudart

#OBJS = GpuSolver.cu.o main.cpp.o

OBJS = main.cu.o a.cpp.o # your files

TARGET = a.out

LINKLINE = $(LINK) -o $(TARGET) $(OBJS) $(LIB_CUDA)

.SUFFIXES: .c .cpp .cu .o

%.c.o: %.c
    $(CC) $(CFLAGS) -c $< -o $@

.cu.o: %.cu
    $(NVCC) $(NVCCFLAGS) -c $< -o $@

%.cpp.o: %.cpp
    $(CXX) $(CXXFLAGS) -c $< -o $@

$(TARGET): $(OBJS) "makefile" #your makefile file name
    $(LINKLINE)
person Gal Katzir    schedule 13.10.2015
comment
CUDA_INSTALL_PATH? - person BЈовић; 14.03.2017