C++ 可变长度数组 (VLA) 警告

Posted

技术标签:

【中文标题】C++ 可变长度数组 (VLA) 警告【英文标题】:C++ Variable length array (VLA) warnings 【发布时间】:2014-04-11 09:20:19 【问题描述】:

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

【问题讨论】:

你试过allocMemory&lt;T&gt;(data, size)吗? 您收到的实际错误信息是什么? @Marius 哎呀。是的,它是源代码中的 allocMemory(data, size)。 a new T[num] 根本不是可变长度数组。如果你有int i; int j[i];,你称之为VLA。 如果这是使用 NVCC 编译的,请确保错误不在其他地方,或者您在某处有一个 CUDACC 宏,以便您真正编译其他部分coe 【参考方案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)

【讨论】:

CUDA_INSTALL_PATH?

以上是关于C++ 可变长度数组 (VLA) 警告的主要内容,如果未能解决你的问题,请参考以下文章

在 MS Visual C++ 中启用 VLA(可变长度数组)?

在其内存应该已被释放后访问可变长度数组

C++ 替代 C99 VLA(目标:保持性能)

为啥零长度 VLA 是 UB?

使用可变长度数组是不是安全?

使用可变长度数组是不是有任何开销?