我正在使用C ++参与编程竞赛。众所周知,这些竞赛对执行时间有严格的限制,使用malloc
或new
从堆分配很慢,所以我尝试过在我的程序中重载operator new
。
它工作正常,直到今天我试图解决一个需要大约700MB内存的问题,我在在线评判中提交并得到complie error
:Compiled file is too large
然后我检查了我的本地.exe
文件,震惊地发现它大约是30MB !!
经过长时间的调试后,我找到了原因:我在operator new
内声明了一个静态数组,似乎.exe
文件的大小与该数组的大小不同!! !
这是我的测试代码:
#include <cstdlib>
const int MAXN=1e6;
struct A {
int x;
void *operator new(size_t) {
static char Pool[MAXN*sizeof(A)];
//static A Pool[MAXN];
//static A *Pool=(A*)calloc(MAXN,sizeof(A));
static A *Me=(A*)Pool;
return Me++;
}
};
int main() {
A *null=new A;
return 0;
}
随着.exe
的增加,MAXN
尺寸会增加。
任何人都可以向我解释这个吗?
在此先感谢^ _ ^
环境:
Windows 7 x32
TDM-GCC 5.1.0
答案 0 :(得分:1)
有什么要解释的?你说你想避免从目标机器的免费商店中获取内存,而这正是你所做的 - 现在可以在程序的静态数据区找到内存。唯一要去的地方就是“堆栈”,这对于这个数据量来说通常太小了。基本上,当你试图违背传统智慧时会发生这种情况。
无论如何,这完全没有意义;当然,动态分配会产生少量开销,但是少量不会对现代系统造成负担。如果你需要一次性分配700MB,那么分配1MB不会花费更多时间。所以就这么做吧。
如果你需要在很多小块中分配700MB,那么可能有理由使用预先分配的内存池,但仍然可以来自new
。
在竞争性节目中击败“严格执行时间限制”的真正方法不是通过“技巧”,而是通过编写一个有效的算法,以适当的速率进行扩展,并且不会在任何地方执行不必要的数据复制。或者,更好的是,停止这种“竞争性[破解]编程”,而是练习擅长编写真正的软件......优化开关在上启用。