【问题标题】:Creating the biggest array of chars which can be allocated创建可以分配的最大字符数组
【发布时间】:2013-05-05 13:10:26
【问题描述】:

我尝试以编程方式检查我可以分配多大的数组,但我的代码似乎没有检查它。如何让它更快?最后我想得到一个例外。

#include "stdafx.h"
#include "iostream"

using namespace std;
int ASCENDING = 1, DESCENDING = 2;

int tworzTablice(int rozmiar, char* t){
    try{
        t = new char[rozmiar];
        delete []t;
    }catch (std::bad_alloc& e){
        tworzTablice(rozmiar - 1,t);
        return -1;
    }
    return rozmiar;
}

int f(long p, long skok){
    char* t;
    try{
        while(true){
            t = new char[p];
            delete []t;
            p = p + skok;
        }
    }
  catch (std::bad_alloc& ba){
    p = tworzTablice(p-1, t);
    cout<<"blad";
  }
  return p;
}

int main(){
    cout<<f(0, 100000000)<<endl;;


    cout<<"koniec"<<endl;
    system("pause");
    return 0;
}

【问题讨论】:

  • 你为什么想知道?
  • 这取决于你的内存大小,我相信。你应该使用 delete [] t;而不是删除 t;在这里。
  • 将缓冲区大小加倍直到分配失败 (t == NULL),然后对最大允许大小进行二进制搜索。
  • @harpun:你最好触摸(提交)内存,因为如果你不这样做,大多数系统都会允许你分配尽可能多的内存......
  • 将受到两件事的限制:可用堆和任何架构限制。例如,后者将是一个具有 16 位整数的古老实现,因此限制为 32 或 64K 个元素。

标签: c++ arrays memory


【解决方案1】:

正如我所指出的,有一种方法可以查询操作系统以确定堆分配内存的最大大小,但我实在记不住它的名字。

但是,您可以轻松找到自己。但是,您应该使用malloc/free 而不是new/delete,以避免对所有单元格进行不必要的初始化;

#include <cstdlib>
#include <cstdio>

size_t maxMem() {
  static size_t size = 0;
  if (!size) {
    size_t m = 0;
    for (void* p = 0; (p = malloc(1<<m)); m++)
      free(p);
    while (m) {
      size_t const testSize = size + (1<<(--m));
      if (void* const p = malloc(testSize)) {
        size = testSize;
        free(p);
      }   
    }   
  }
  return size;
}

int main() {
  // forgive me for using printf, but I couldn't remember how to hex-format in std::cout
  printf("%u (hex %X)\n",int(maxMem()),int(maxMem()));
}

在我的 64 位机器上,我得到了

2147483647 (hex 7FFFFFFF)

在另一个 32 系统上我得到

2140700660 (hex 7F987FF4)

如果你真的需要的话,你可以继续new 一个那个大小的数组。但是请注意,这是您可以请求的最大 连续 块。您的进程可能分配的总内存更大,并且取决于安装的 RAM 和保留的交换空间。

【讨论】:

    【解决方案2】:

    分配所有可用内存可能是一个的想法,但如果你真的想要:

    vector<char*> ptrs;
    int avail;
    try {
        while (true)
            ptrs.push_back(new char[1000]);
    }
    catch (bad_alloc& b)
    {
        avail = ptrs.size() * 1000;
        for (int i = 0; i < ptrs.size(); i++)
           delete[] ptrs[i];
    }
    

    【讨论】:

    • -1 :所有 OP 需要一个 std::stringstd::vector&lt;char *&gt; 的建议真的很糟糕
    • @AlokSave 我假设您的意思是创建一个string 并不断增长它直到它引发异常? AFAIK,字符串必须在内存中连续分配,因此该方法将显示可用内存比实际内存少
    • 是的,连续数据结构只会显示可以连续分配多少内存,而不是总共有多少可用内存。但是,这个答案仍然没有考虑到某些操作系统在您尝试使用它之前不会提交内存,因此它可能会产生错误的结果。
    • @AlokSave Lol,你读过 OP 的问题吗? “已尝试通过代码检查我可以分配多大的数组”std::string 不是 数组。 @nullptr这里的另一件事是通过创建“许多”数组,从技术上讲,这是作弊,因为每个指针都可以分布在内存中,而单个分配将是连续的-一个真正的数组(具有最大的大小)(其中,我认为,是问题)
    • @voidptr:Q 和答案都是虚构且毫无意义的。两者都应该得到-1。随意大声笑,但 Q 和答案都没有任何实际用途或应用。
    猜你喜欢
    • 1970-01-01
    • 2013-04-15
    • 2012-10-31
    • 1970-01-01
    • 2016-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多