c++ - SystemC sc_signal 数组内存边界
问题描述
我一直在尝试使用 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 之间肯定存在某种界限。谁能确认这确实是应该发生的事情,或者对我如何绕过这个限制并获得更多信号有任何想法?
解决方案
在 64 位 Linuxsizeof(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;
}
推荐阅读
- typescript - 使用 TypeScript 和 Sinon 时如何在单元测试中存根依赖项
- spring - spring @Scheduled 注释适用于本地 Websphere,但不适用于安装在服务器上的 Websphere
- tiff - 我想将我的 .tif 文件转换为 R 中的 .asc
- c# - 设计问题:需要一些关于如何构建类继承以避免重复代码的提示
- django - 当值不存在时设置一个值
- c# - MSBuild on Server errorCS0234 错误.net 4.7.2
- redis - docker-compose 中的 Redis 主从设置 - 只读从属
- c - 程序以进程状态终止 -1073741819 - graphics.h
- azure-logic-apps - HTTP 操作中的 URI 重复
- javascript - 如何在后续保存时重新启动 Gulp 任务?