【问题标题】:SystemC sc_signal array memory boundsSystemC sc_signal 数组内存边界
【发布时间】:2018-07-13 16:51:21
【问题描述】:

我一直在尝试使用 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 之间肯定存在某种界限。谁能确认这确实是应该发生的事情,或者对我如何绕过这个限制并获得更多信号有任何想法?

【问题讨论】:

  • 什么是sc_signal?它有多大?你的堆栈(通常存储局部变量的地方)可以处理 80000 个这样的对象吗?请记住,堆栈是有限资源,Windows 中的进程通常只有 1MiB 堆栈。
  • 我明白了,是的 sc_signal 占用 128 个字节。感谢您的洞察力。我已经调整了分配给堆栈的内存量,现在它可以工作了。
  • values[100][800]; 这是一个相当大的数组要放入堆栈。
  • 作为一项规则,每个堆栈帧不应超过 4096 字节。否则,您可能错过保护页面,并开始覆盖随机内容而不是崩溃。使用 GCC,-Werror=stack-usage=4096

标签: c++ segmentation-fault systemc


【解决方案1】:

在 64 位 Linux 上,sizeof(sc_signal&lt;float&gt;) 是 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;
}

【讨论】:

    猜你喜欢
    • 2014-12-12
    • 1970-01-01
    • 1970-01-01
    • 2023-03-15
    • 1970-01-01
    • 2015-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多