gpt4 book ai didi

c++ - 关于 operator new 中的静态数组

转载 作者:行者123 更新时间:2023-11-28 05:10:31 25 4
gpt4 key购买 nike

我正在参加使用 C++ 的编程比赛。众所周知,这些比赛对执行时间有严格的限制,并使用 mallocnew 从堆中分配很慢,所以我尝试在我的程序中重载 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

最佳答案

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

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

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

在竞争性编程中克服“严格的执行时间限制”的真正方法不是通过“技巧”,而是通过编写一种高效的算法,该算法能够以适当的速率扩展并且不会在任何地方执行不必要的数据拷贝。或者,更好的是,停止这种“竞争性的 [broken] 编程”,而是练习擅长编写真正的软件...打开优化开关。 p>

关于c++ - 关于 operator new 中的静态数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43605618/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com