我需要预先分配我的应用程序将使用的所有内存。然后,每当需要时,就用我需要进行计算的数据覆盖该内存。在进行任何计算之前,必须首先分配内存,因为我正在尝试并行运行多线程 CUDA 算法,如我的问题中所述 ( Multi-Threaded CPU CUDA application not asynchronous when calling CudaFree )。
我认为我可以将所需的所有内存分配为字节指针,然后将该指针存储为 void 指针:
void * allocateMemory()
{
byte *mem;
int nbytes = 13107200;
mem = (byte *) malloc(nbytes);
return mem;
}
稍后在我的程序中,我想使用已分配的内存来存储数据。我事先不知道数据的类型,但我知道它的大小不会超过分配的限制。
void doSomething(void * mem)
{
int *a = (int*) mem;
for (int i = 0; i < 100; i++)
{
a[i] = i;
}
//do stuff
}
还有许多其他函数,例如上面的 doSomething(void * mem),但使用 double 类型或 float 类型,甚至可能使用 byte 类型。我需要能够用我需要的任何数据类型覆盖原始分配的内存。上面的代码不起作用,因为它说我不能遵循 void 指针。它还说我试图读取或写入 protected 内存。
执行此操作的正确方法是什么?实现我的目标的最佳方法是什么,即在开始时分配所有内存,然后在整个过程中使用必要的内存?谢谢!
最佳答案
听起来您有两个问题。
无法取消引用 void 指针。在代码中的某个位置,您使用了
allocateMemory()
的结果,而没有进行强制转换。您给出的代码是可以的,但是编译器将其标记为错误的任何行都是不行的。例如,也许您有:void *foo = allocateMemory(); foo[42]; // compiler doesn't have a real type here - error ((int*)foo)[42]; // compiler happy
尝试访问 protected 内存。在您的代码中的某个地方有一个无效的指针。最可能的原因是
allocateMemory()
返回 NULL(您没有检查)。
我觉得你的总体方法还不错;您描述的问题与代码中的细节有关,而不是总体思路。
关于c - 如何在应用程序开始时分配所有内存,然后在整个过程中相应地对其进行类型转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20224986/