新运算符-C++可变长度数组(VLA)警告

new operator - C++ Variable length array (VLA) warnings

本文关键字:数组 VLA 警告 运算符 -C++      更新时间:2023-10-16

我在SO上读到了关于VLA的不同答案,但找不到答案。在我的例子中,我有一个分配内存的函数:

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:1:6:警告:ISO C++不支持可变长度数组类型[-Wvla]data=new T[numElems];

我认为您的项目编译方式不对。

尝试使用流动的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)