首先来看一段最简单的代码,在两个oj平台上的表现:
#include <iostream>
using namespace std;
char c[1000*1000*100];
int main() {
int a, b;
while (cin >> a >> b) { cout << a+b << endl;}
return 0;
}
大家一眼就可以看出,这是各大oj有名的1000问题——a+b problem 有木有!?
在zoj上,报Memory Limit Exceed.
而在bnuoj上,Accepted!
思考了两天,在各大论坛和qq群里发贴讨论,同学们给出了各种猜测,例如:
1.有同学说:各大oj的栈/堆限制不同吧?(程序中的全局变量不是存在栈或者堆上的好么,再说了程序中声明的是100MB,是必然会超的啊)。
2.还有同学说:zoj是linux系统,bnu是win? (先不论bnu是不是win,为何两个操作系统对内存的判别会有差异?关于win和linux的内存管理策略的差异,我专门去图书馆找了两本书对比,发现两者在虚拟内存和页式内存管理策略上,非常相似,似乎很难找到根源)
3.还有很多同学扯到什么ulimit之类的(显然oj不会用这么粗糙的内存监测方式来对大家的进程作内存监视)