【问题标题】:How to allocate memory space without using malloc or new operator?如何在不使用 malloc 或 new 运算符的情况下分配内存空间?
【发布时间】:2011-04-24 16:50:19
【问题描述】:

昨天我朋友面试的时候,被问到一个问题: 实现一个不使用 *alloc 或 new 运算符来分配内存空间的函数,并且该函数应该返回一个指向该地址的指针。 他和我都找不到答案。

【问题讨论】:

  • 抱歉这个问题让你们觉得很愚蠢。尽管如此,我得到了答案并且得到了改进。我认为愚蠢总比无知好。
  • 下一步是什么?如何在不使用编译器的情况下编译 C++ 代码?
  • 如果您想让某人思考,或者如果您正在雇用某人编写 C 标准库,这是一个完全合理的问题。显然我不能说这里发生了什么,但可能面试官对候选人的思考过程比最终答案更感兴趣。在那种情况下,说:“这很愚蠢,我不知道,我拒绝尝试!”不会对你有任何好处。

标签: c++


【解决方案1】:

我认为这个问题更像是一个谜题,而不是一个显示编程经验的问题。我的解决方案是分配一个全局字节数组,而不是堆:

char heap[MAX_ALLOWED_MEM];

/*
   The following function uses 'heap' as raw memory!
   void* like_malloc(size_t bytes);
   ...
*/

【讨论】:

  • 是的,我认为它更像是一个谜题,就像你如何跳出框框思考一样。对于这些类型的问题,最好尝试概述尽可能多的解决方案并讨论它们的优缺点,无论多远。确定更多选项是对您专业知识的衡量。面试的人会做出某种判断: 1) 没有回答,基本技能水平还可以。 2) 至少一些想法 = 一些技能和解决问题的能力,3) 讨论解决方案的问题,包括性能、线程安全、可移植性 = 更高水平的经验。
  • 这与跳出框框思考无关,这是一个编程知识问题,因为这或多或少是在准系统中创建堆的方式(您可能会使用预定义的部分内存映射而不是让编译器生成一个全局的,一旦你知道内存映射)。问题是,“如果被要求这样做,你是那种有机会编写内存分配器的程序员吗?”,真正的工作是编写函数(以及随附的free)。如果你不是,也许他们想要一个较低级别的程序员来完成这项工作。
  • 顺便说一下,K&R 的 C 编程语言中讨论了这个确切的问题以及解决方案(通过静态分配您自己的堆,如此处所示)。即使对于 C++ 工作,这本书也应该是必读的。
【解决方案2】:

根据您的平台,您有几个选择:

  • 由于这是 C++,您可以作弊并调用其中一个 STL allocators。我怀疑那是面试官想要的,但谁 确定知道吗?
  • 您始终可以使用固定大小的池,正如一些答案所建议的那样。
  • sbrk 也是一种选择,但不鼓励使用它并且不再使用 POSIX 的一部分。
  • 您也可以使用mmap(或VirtualAllocCreateFileMapping Windows)作为内存来源,但如果您希望内存块更小 除了整个页面,您还需要编写一些代码来管理 记住这些函数的返回值。

您的分配器应确保针对您的平台正确对齐内存: 在某些系统上,未对齐的内存访问是无效的操作,并且 其他人有一个性能打击与对齐访问。在现实中,生产 您可能还希望提供free 操作以避免占用的代码 覆盖所有系统的内存和锁定,以使您的堆线程安全。

【讨论】:

    【解决方案3】:

    您可以通过诸如 sbrk() 之类的系统调用来执行此操作,而不是使用 C 库函数或 C++ 语言功能。但是,绝对没有理由这样做,所以这是一个非常糟糕的问题。

    【讨论】:

    • 如果您需要由文件支持的内存怎么办?你如何从 malloc 或 new 中得到它?
    【解决方案4】:

    一个永远不会释放的超级简单的。

    class allocator{
            static char mem_pool[1048576];
            char* place;
        public:
            allocator(){
                 place = mem_pool;
            }
            allocator(const allocator& a){
                 place = a.place;
            }
            char* alloc(size_t size){
                char* ret = place;
                place += size;
                return  ret;
            }
    }
    

    【讨论】:

    • 好主意,但在具有几个静态局部变量的函数中安全地执行此操作会更容易。照原样,您的复制构造函数邀请人们将重叠的内存区域返回给 alloc 的后续调用者。
    猜你喜欢
    • 2020-02-03
    • 2012-11-29
    • 1970-01-01
    • 2017-09-16
    • 1970-01-01
    • 2011-03-16
    • 2013-08-13
    • 2019-02-03
    相关资源
    最近更新 更多