【问题标题】:`#define` a very large number in c++ source code`#define` C++ 源代码中的一个非常大的数字
【发布时间】:2016-07-19 17:29:11
【问题描述】:

嗯,这个问题并不像听起来那么愚蠢。

我正在使用 C++11 <array> 并想声明一个这样的数组:

array<int, MAX_ARR_SIZE> myArr;

MAX_ARR_SIZE 将在头文件中定义,可能非常大,即 10^13。目前我正在像学龄前孩子一样打字

 #define MAX_ARR_SIZE 1000000000000000

如果没有其他选择,我可以忍受。我不能在这里使用pow(10, 13),因为它不能在编译时进行评估;数组初始化将失败。我不知道有任何简写方式来输入这个。

【问题讨论】:

  • 好吧,您可以使用const size_t max_array_size = 10e15;,但是这样大小的数组对于堆栈来说可能太大了。拥有MAX_ARR_SIZE 表示您有某种动态大小;你不使用std::vector有什么原因吗?
  • @TartanLlama 或constexpr size_t max_array_size = 10e15;
  • 这闻起来像XY problem...
  • @Dilawar 不,它的类型是 size_t(无符号整数类型)
  • 注意:如果您的系统没有 4000(或 8000)TB 的可用内存...。

标签: c++ arrays c++11 compile-time


【解决方案1】:

#define 用于常量更像是 C 而非 C++ 的一种方式。

你可以这样定义你的常量:

const size_t MAX_ARR_SIZE(1e15); 

【讨论】:

【解决方案2】:

你可以使用:

#define MAX_ARR_SIZE 1e15

1e15 非常大,可能不会被分配。

【讨论】:

  • 太大了十倍。
  • @gnasher 是的,我解决了这个问题。
【解决方案3】:
#define MAX_ARRAY_SIZE (1000ull * 1000 * 1000 * 1000 * 1000)

【讨论】:

    【解决方案4】:

    如果您使用 const 而不是#define,您实际上可以在 C++11 的编译时计算 pow(10, 15) 和类似的表达式。只要确保你选择了一个足够大的基元。

    【讨论】:

      【解决方案5】:

      在这种情况下,最好使用const size_t 而不是#define


      我想补充一点,从 C++14 开始,在编写整数文字时,您可以添加可选的单引号作为分隔符。

      1'000'000'000'000'000
      

      这看起来更清楚了。

      【讨论】:

        【解决方案6】:

        你可以定义一个constexpr函数:

        constexpr size_t MAX_ARR_SIZE()
        {
            return pow(10, 15); 
        }
        

        这样您可以在编译时进行更复杂的计算。

        然后将其用作array&lt;int, MAX_ARR_SIZE()&gt; myArr;,它将在编译时进行评估。

        就像已经提到的那样,您可能无法在堆栈上分配该大小。

        编辑

        我在这里有一个错误,因为 pow 本身不是 constexpr 你不能使用它,但它是可以解决的,例如使用这里讨论的 ipow:c++11 fast constexpr integer powers

        这里是函数引用:

        constexpr int64_t ipow(int64_t base, int exp, int64_t result = 1) {
          return exp < 1 ? result : ipow(base*base, exp/2, (exp % 2) ? result*base : result);
        }
        

        只需将MAX_ARR_SIZE() 更改为:

        constexpr size_t MAX_ARR_SIZE()
        {
            return ipow(10, 15); 
        }
        

        【讨论】:

        • 这很棒。它解决了这个问题和一个很好的一般提示。
        • @dilawar 如果它解决了你的问题,别忘了接受答案 ;)
        猜你喜欢
        • 2022-01-11
        • 2015-08-18
        • 1970-01-01
        • 2021-09-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多