Dun*_*yne 5 c malloc retro-computing sdcc
当我运行使用SDCC 3.1.0编译此代码,并在Amstrad CPC 464上运行它(在仿真下,在Wine上运行WinCPC 0.9.26):
void _test_malloc()
{
long idx = 0;
while (1)
{
if (malloc(5))
{
printf("%ld\r\n", ++idx);
}
else
{
printf("done");
break;
}
}
}
Run Code Online (Sandbox Code Playgroud)
......它一直在92 malloc()s上点击.我做了460字节,这引出了几个问题:
malloc()在这个系统上做什么?我有点希望即使在64kB系统上也能提供更多的存储空间
64kB系统和128kB系统的行为是一致的; 我是否必须执行某种魔术才能访问额外的内存,例如手动银行切换?
实际上,正如Duncan Bayne所说,SDCC为Z80实现的默认内存管理器中存在非常窄的堆空间.
但是,在尝试修改SDCC的堆之前,您应该考虑是否确实需要Amstrad CPC上的动态内存.通常,在运行拥有整个硬件的独立应用程序时,使用动态内存是没有意义的.您可以测试并知道您拥有多少内存,并且可以直接在任何您想要的内存中写入内存.没有内存保护,也没有其他应用程序在后台运行.
因此,您最好设计自己的内存映射(您希望数据在哪里以及使用多少空间),然后直接管理内存.此外,代码优化在这台机器中非常重要,手动管理内存与优化极为相关.
如果您的代码直接在Amstrad CPC中运行(即不使用像Symbos这样的现代操作系统),则必须手动处理银行切换以访问内存.Z80 CPU有一个16位总线,只能在不进行bank切换的情况下处理64KB内存.