关于操作员新的静态阵列



我正在使用C 参加编程比赛。据所有人都知道,这些竞赛对执行时间有严格的限制,并且使用mallocnew从HEAP分配很慢,所以我尝试了我的程序中的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;
}

随着MAXN的增加,.exe的大小增加。有人可以向我解释一下吗?预先感谢 ^_ ^

环境:

Windows 7 x32

TDM-GCC 5.1.0

有什么解释?您说过,您想避免从Target Machine的免费商店中获取内存,而这正是您所做的;现在可以在程序的静态数据区域中找到内存。唯一要去的地方是"堆栈",对于这一数量的数据而言,它通常太小了。基本上,这是当您尝试违背传统智慧时会发生什么。

无论如何,这完全毫无意义。当然,动态分配有少量的开销,但少量不会对现代系统征税。如果您需要一次分配700MB,那将比分配1MB更多的时间。所以要做。

如果您需要在许多小部分中分配700MB,则您 May 有理由使用预先分配的内存池,但这仍然可以来自new

在竞争编程中击败"严格执行时间限制"的真实方法不是通过"技巧",而是通过编写有效的算法,该算法以适当的速度扩展并且不会在任何地方执行不必要的数据副本。或者,更好的是,请停止使用此"竞争性[破碎]编程",而练习善于编写 real 软件...随着优化开关的。。p>

最新更新