gpt4 book ai didi

c++ - 你能在 C++ 中使用 'new' 模拟动态数组大小吗?

转载 作者:行者123 更新时间:2023-12-01 19:55:31 27 4
gpt4 key购买 nike

我知道你可以使用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那么动态分配呢?如果是这样,那么这只是一个设计选择,不允许动态数组大小分配的原因是什么?

如果答案是,不,它不会运行,考虑到限制是否有替代解决方案?

最佳答案

does the above code actually only allocate new memory when it's line of code is run, or does it prepare memory for all those new calls, and just assign the pointer to the one requested?

直到运行时实际调用 new 时才会分配内存。

Essentially, would this program run on computer where MAX_INPUT_SIZE exceeds the available RAM, but the actual data_size does not?

是的。

why does new force you to have an array size that resolves at compile time?

事实并非如此。你从哪里得到这个想法的?只有静态数组需要在编译时指定其大小。 动态数组则不然。使用 new[] 的主要好处之一是您可以为其提供一个直到运行时才知道的值。例如:

char *data;
long long int data_size;
/* receive input size */

data = new char[data_size];

关于c++ - 你能在 C++ 中使用 'new' 模拟动态数组大小吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59203395/

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