【问题标题】:Huge memory consumption during compilation when passing constexpr by const reference通过 const 引用传递 constexpr 时编译期间的巨大内存消耗
【发布时间】:2021-01-07 23:56:49
【问题描述】:

使用 g++ 编译以下代码会消耗惊人的大量内存(超过 5gb)。

#include <iostream>
#define N 100000

struct A {
    int tab[N];
    constexpr A(): tab{} {
        for (size_t i = 0; i < N; ++i) tab[i] = i;
    }
};

struct B {
    int tab[N];
    constexpr B(const A& a): tab{} {
        for (size_t i = 0; i < N; ++i) tab[i] = a.tab[N-1-i] * 2;
    }
};

constexpr A a;
constexpr B b(a);
 
int main(){ std::cout << b.tab[N-5]; }

这似乎是由于在B 的 constexpr 构造函数中传递了一个const A&amp; 引起的——按值传递解决了这个问题。 那里发生了什么?

g++ 版本:(Ubuntu 9.3.0-17ubuntu1~20.04) 9.3.0。 在某些旧版本上也是如此。

使用 clang-10 编译时不会出现此问题。

【问题讨论】:

  • 为什么不向 g++ 工程师报告呢?我确定他们有一个错误票证系统。
  • 提示:在 C++ 中尝试使用 const 而不是 #define
  • 值得探索此内存占用量与N 的各种值之间的比例关系,因为这可能会意外地成为二次方。
  • 为了记录,它也发生在 Arch 上的 g++ 10.2.0 中。
  • 内存使用与 B 的构造函数中的迭代次数呈线性关系,因此它似乎是二次的(我的意思是 A 的大小乘以迭代次数)。稍后将尝试提交票证

标签: c++ compiler-errors compilation g++


【解决方案1】:

似乎在 10.3 和 11 版本中已修复。

https://gcc.gnu.org/bugzilla/show_bug.cgi?id=96197

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-20
    • 1970-01-01
    • 2016-04-29
    • 2018-07-03
    • 2020-11-18
    • 1970-01-01
    • 2015-11-25
    相关资源
    最近更新 更多