关于操作员新的静态阵列
about static array inside operator new
我正在使用C 参加编程比赛。据所有人都知道,这些竞赛对执行时间有严格的限制,并且使用malloc
或new
从HEAP分配很慢,所以我尝试了我的程序中的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;
}
随着MAXN
的增加,.exe
的大小增加。有人可以向我解释一下吗?预先感谢 ^_ ^
环境:
Windows 7 x32
TDM-GCC 5.1.0
有什么解释?您说过,您想避免从Target Machine的免费商店中获取内存,而这正是您所做的;现在可以在程序的静态数据区域中找到内存。唯一要去的地方是"堆栈",对于这一数量的数据而言,它通常太小了。基本上,这是当您尝试违背传统智慧时会发生什么。
无论如何,这完全毫无意义。当然,动态分配有少量的开销,但少量不会对现代系统征税。如果您需要一次分配700MB,那将比分配1MB更多的时间。所以要做。
如果您需要在许多小部分中分配700MB,则您 May 有理由使用预先分配的内存池,但这仍然可以来自new
。
在竞争编程中击败"严格执行时间限制"的真实方法不是通过"技巧",而是通过编写有效的算法,该算法以适当的速度扩展并且不会在任何地方执行不必要的数据副本。或者,更好的是,请停止使用此"竞争性[破碎]编程",而练习善于编写 real 软件...随着优化开关的。。p>
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- #为""定义宏;静态";针对不同的上下文
- cmake如何在fedora工作站中找到boost静态库包
- OpenMP阵列性能较差
- 静态数据成员的问题-修复链接错误会导致编译器错误
- 关于操作员新的静态阵列
- C 静态数组,例如动态阵列
- GDB打印具有虚拟函数类的非弦乐值的静态常量阵列的无效地址
- 静态函数阵列上未解决的外部符号
- C 使用谷物序列化结构的静态阵列
- 静态成员的静态阵列:初始化顺序惨败的可能性
- 声明和修改结构的静态阵列-CPP
- C 98如何在标题中初始化静态结构阵列
- C 类中的静态动态2维数阵列
- 动态和静态阵列
- 静态2D阵列初始化
- 其他静态阵列破坏了OMAPL138目标(CCS5.2)上的DSP应用程序
- 静态数组成员的尺寸返回指针的大小,而不是阵列
- C 11初始化类静态常量阵列
- 静态阵列以适应屏幕