C++ 强制NVCC不考虑构造函数的常量内存

C++ 强制NVCC不考虑构造函数的常量内存,c++,constructor,cuda,nvcc,C++,Constructor,Cuda,Nvcc,我用构造函数声明一个包含对象(myVector)的结构数组 struct decoderdata{ myVector<int> code; myVector<int> sequence; }; __constant__ decoderdata var[4]; struct decoderdata{ 矢量码; myVector序列; }; __常数_uu解码数据变量[4]; myVector是我自己的带有构造函数和析构函数的类。我在宿主代码中使用这些构造函数。

我用构造函数声明一个包含对象(myVector)的结构数组

struct decoderdata{
  myVector<int> code; 
  myVector<int> sequence;
};
__constant__ decoderdata var[4];
struct decoderdata{
矢量码;
myVector序列;
};
__常数_uu解码数据变量[4];
myVector是我自己的带有构造函数和析构函数的类。我在宿主代码中使用这些构造函数。我不想在分配常量内存时调用构造函数。我将使用cudaMemcpyToSymbol分别初始化常量内存。我想要的是,恒定的内存空间,大小为4个“decoderdata对象”,类型为decoderdata数组

当我编译时,nvcc编译器创建 错误:无法为设备上的非空构造函数或析构函数生成代码

<>我不想NVCC考虑我的构造函数。如何在NVCC中抑制/禁用此特定错误?
或者CUDA中是否有任何解决方法来实现我想要的功能?

如果您只需要内存,而不需要对象,请执行以下操作:

__constant__ char data[4 * sizeof(decoderdata)];

您只需要清楚一个事实,这里没有任何对象,并且不能将原始内存视为对象。因为内存是恒定的,所以你也不能在内存中放置新的内容。充其量,您可以将一些微不足道的可复制对象复制到其中,但这似乎不太可能(因为具有用户定义构造函数的某些对象并非微不足道的可复制对象)。

这毫无意义。不能有未正确构造的对象。如果不能执行构造函数,就不能有对象。是否为
myVector
定义了设备构造函数?。这是什么?有没有办法将这个常量内存映射到decoderdata[]类型?(类似于static_cast?@lxkarthi:你可以随心所欲地进行强制转换,但这只是一种未定义的行为,你的程序将是一个可怕的、混乱的程序。我正在创建一个结构数组,以便在单个内核中处理多个代码。所以,我不能使用内核参数(通常在常量内存中)传递它。所以我显式地创建常量内存来复制结构的数组。顺便说一句,为什么NVCC会在常量内存中为构造函数创建错误。一个警告就足够了。我是否可以抑制此错误以获取可执行文件?@lxkarthi:您不能这样做,因为(a)常量内存是常量,因此设备代码修改它的任何尝试都是非法的,(b)常量内存是静态定义的,并在上下文建立时初始化,因此,不可能在对象实例化时运行可执行代码(只允许在运行的内核中运行)。因此,您想做的是非法的,编译器无法执行,因此会显示错误消息。@Talonmes(b)我知道常量是在上下文建立时建立的&不会调用构造函数。我的疑问是“为什么编译器将其显示为错误?”?他们可以把它作为警告,这样我就可以得到我的可执行文件了。许多人在创建常量对象时会遇到问题。如果它们删除了所有构造函数,那么在CPU对象中,它们必须显式地调用init函数。