【发布时间】: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