SystemC sc_signal数组内存范围

时间:2018-07-13 16:51:22

标签: c++ segmentation-fault systemc

我一直在尝试制作符合SystemC规范的信号阵列,但是在特定的意外情况下遇到了一些分段错误。这使我相信,对于使用SystemC可以拥有的变量数量,存在某种内存限制,我有兴趣确认并找到解决方法。

考虑以下sc_main函数示例:

sc_main(int argc, char* argv[]) {
    sc_signal<float>    values[100];
    return 0;
}

这个运行得很好。但是,当我运行下面的代码时...

sc_main(int argc, char* argv[]) {
    sc_signal<float>    values[100][800];
    return 0;
}

我遇到了分段错误:11.(80,000个信号)

我进一步发现,在40,000个信号上我没有错,因此在40,000和50,000之间必须存在某种界限。任何人都可以确认这确实是应该发生的事情,或者对如何解决此限制并拥有更多信号有任何想法吗?

1 个答案:

答案 0 :(得分:0)

在64位Linux上,sizeof(sc_signal<float>)为192字节。默认堆栈大小为8 MB。因此,您可以在堆栈上分配大约41000个信号,这与您的实验结果相关。

通常,您不应该在堆栈上分配SystemC对象。现实世界中的设计通常不适合8 MB。而是在堆上分配:

#include <systemc.h>

struct test_module : sc_module {
    sc_signal<float>    values[100][800];
    SC_CTOR(test_module) {}
};

int sc_main (int argc, char**argv) {
    auto tmod0 = std::make_unique<test_module>("tmod0");
    sc_start();
    return 0;
}