我知道您可以使用malloc
来创建动态大小的数组,但是我对使用new
做同样的事情感兴趣,部分原因是malloc
在C ++中被认为是不好的做法,主要是出于好奇。
说我正在编写一个程序,该程序将接收可能多达MAX_INPUT_SIZE
的字节输入,该字节太大,以至于分配该大小的数组可能会妨碍其他程序运行的能力在同一RAM上。但是,所有输入大小[0,MAX_INPUT_SIZE]
的接收可能性均等。有没有一种方法可以编写程序,使得堆上的内存分配与输入大小成比例,因此除非收到足够大的输入,否则其他程序的性能不会受到影响?假设这些限制:
- 不能使用
malloc
- 不能使用
vector
或其他包装器(假设我们正在寻求极快的性能) - 解释数据的算法必须将所有数据都放在一个数组中(出于性能方面的考虑,因此仍然可以非常快速地处理小输入)
- 程序应分配大约等于输入大小的内存
这些限制是不切实际的严格限制,但这只是假设。这是一个潜在的解决方案:
char *data;
long long int data_size;
/* receive input size */
if( data_size <= 1000 )
data = new char[1000];
else if( data_size <= 10000 )
data = new char[10000];
...
else if( data_size <= MAX_INPUT_SIZE / 10 )
data = new char[MAX_INPUT_SIZE / 10];
else if( data_size <= MAX_INPUT_SIZE )
data = new char[MAX_INPUT_SIZE];
我的问题是,以上代码实际上只在运行其代码行时才分配new
内存,还是为所有这些new
调用准备内存,而只是将指针分配给一个请求?
本质上,此程序是否可以在MAX_INPUT_SIZE
超出可用RAM的计算机上运行,但实际的data_size
不会吗?
如果答案是肯定的,它将运行,那么为什么new
会强制您具有在编译时可解析的数组大小?当然,C ++编译器是否可以使new
动态分配呢?如果是这样,那仅仅是设计选择,而不允许动态数组大小分配的原因是什么?
如果答案为“否”,那么它将不会运行,是否有其他解决方案?