关于operator new里面的静态数组

时间:2017-04-25 08:39:01

标签: c++ static new-operator

我正在使用C ++参与编程竞赛。众所周知,这些竞赛对执行时间有严格的限制,使用mallocnew从堆分配很慢,所以我尝试过在我的程序中重载operator new

它工作正常,直到今天我试图解决一个需要大约700MB内存的问题,我在在线评判中提交并得到complie errorCompiled 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

1 个答案:

答案 0 :(得分:1)

有什么要解释的?你说你想避免从目标机器的免费商店中获取内存,而这正是你所做的 - 现在可以在程序的静态数据区找到内存。唯一要去的地方就是“堆栈”,这对于这个数据量来说通常太小了。基本上,当你试图违背传统智慧时会发生这种情况。

无论如何,这完全没有意义;当然,动态分配会产生少量开销,但是少量不会对现代系统造成负担。如果你需要一次性分配700MB,那么分配1MB不会花费更多时间。所以就这么做吧。

如果你需要在很多小块中分配700MB,那么可能有理由使用预先分配的内存池,但仍然可以来自new

在竞争性节目中击败“严格执行时间限制”的真正方法不是通过“技巧”,而是通过编写一个有效的算法,以适当的速率进行扩展,并且不会在任何地方执行不必要的数据复制。或者,更好的是,停止这种“竞争性[破解]编程”,而是练习擅长编写真正的软件......优化开关在上启用