转换为常量类型,初始化数组
Posted
技术标签:
【中文标题】转换为常量类型,初始化数组【英文标题】:Converting to constant type, initializing an array 【发布时间】:2015-02-08 23:59:40 【问题描述】:我有一个非常基本的问题:是否可以将 int 变量转换为常量,所以我可以静态初始化具有给定长度的数组(没有指针和新函数)。我只是好奇,我知道如何动态地做到这一点。 谢谢
【问题讨论】:
不,数组需要在编译时知道它们的大小,在运行时你无法解决这个问题。 即使您找到了解决方法,我也怀疑编译器会将其视为可变长度数组以外的任何东西。 我在问这个,因为我写的是 CUDA 程序。我想使用共享内存,但不确定是否可以动态分配,动态分配存在一些问题。 可能重复:***.com/questions/14417318/cuda-new-delete 您可以使用alloca()
在标准C 和C++ 的堆栈上分配动态内存量;检查CUDA是否支持它。请注意,返回的指针的生命周期绑定到调用alloca()
的函数,因此当该函数返回时指针变为无效!
【参考方案1】:
数组的大小必须是编译时常量,即它必须在编译时知道。您显然无法将编译时未知的内容转换为编译时已知的内容,因为您在编译时不知道它。这将如何运作,您是否希望价值能够及时返回?
如果您在编译时不知道所需的大小,请使用std::vector
、not 指针和new
。
【讨论】:
【参考方案2】:在评论中,您提到使用共享内存。一般来说,std::vector 适用于动态大小的数组。该类有一个分配器,并将在需要时增长数组并复制元素。这不适用于共享内存。共享内存是数组大小固定且指针在运行时确定的特殊情况。
即使你在编译时就知道共享内存段的大小,如下语句:
char myData[100];
将为 myData 分配内存。共享内存是使用指针然后将其视为数组的好例子。例如,您可以这样做:
int total = 0;
int n = getSizeOfSharedMemorySomehow();
char *myData = getSharedMemoryPointerSomehow();
for (int i = 0; i < n; i++)
total += myData[i];
【讨论】:
以上是关于转换为常量类型,初始化数组的主要内容,如果未能解决你的问题,请参考以下文章