【问题标题】:Converting to constant type, initializing an array转换为常量类型,初始化数组
【发布时间】:2015-02-08 23:59:40
【问题描述】:

我有一个非常基本的问题:是否可以将 int 变量转换为常量,所以我可以静态初始化具有给定长度的数组(没有指针和新函数)。我只是好奇,我知道如何动态地做到这一点。 谢谢

【问题讨论】:

  • 不,数组需要在编译时知道它们的大小,在运行时你无法解决这个问题。
  • 即使您找到了解决方法,我也怀疑编译器会将其视为可变长度数组以外的任何东西。
  • 我在问这个,因为我写的是 CUDA 程序。我想使用共享内存,但不确定是否可以动态分配,动态分配存在一些问题。
  • 您可以使用alloca() 在标准C 和C++ 的堆栈上分配动态内存量;检查CUDA是否支持它。请注意,返回的指针的生命周期绑定到调用alloca() 的函数,因此当该函数返回时指针变为无效!

标签: c++ arrays dynamic


【解决方案1】:

数组的大小必须是编译时常量,即它必须在编译时知道。您显然无法将编译时未知的内容转换为编译时已知的内容,因为您在编译时不知道它。这将如何运作,您是否希望价值能够及时返回?

如果您在编译时不知道所需的大小,请使用std::vectornot 指针和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];
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-23
      • 1970-01-01
      • 1970-01-01
      • 2013-09-03
      • 2012-09-07
      相关资源
      最近更新 更多