如何在 STL 容器中存储任意数量的动态创建的实例(不同类型的),以便以后只有容器才能释放内存?
它应该像这样工作:
std::vector< void * > vec;
vec.push_back( new int(10) );
vec.push_back( new float(1.) );
现在,如果vec
超出范围,则指向实例的指针将被破坏,但不会释放int
和的内存。float
显然我不能这样做:
for( auto i : vec )
delete *i;
因为void*
不是指向对象的类型。
您可能会反对并争辩说这不是一个好主意,因为无法访问向量的元素。没错,我自己也不会访问它们。NVIDIA 驱动程序将访问它们,因为它只需要地址(void*
很好)作为内核调用的参数。
我想这里的问题是它可以存储不同的类型。想知道如果union
想将其作为参数传递给 cuda 内核,是否可以解决问题。
内核采用不同类型的参数,并通过遍历您事先不知道类型的表达式树(表达式模板)来收集。因此,在访问叶子时,您将存储参数。它只能是 void*,以及内置类型 int、float 等。
可以在内核启动后立即删除向量(启动是异步的,但驱动程序首先复制参数然后继续主机线程)。第二个问题:每个参数都传递一个 void* 给驱动程序。无论它是 int、float 还是 void*。所以我想一个人可以分配比需要更多的内存。我认为工会的东西可能值得一看。