【发布时间】:2019-11-21 13:53:21
【问题描述】:
上下文:我正在做一个项目,客户需要我们使用自定义动态内存分配,而不是从堆栈中分配对象。请注意,有问题的对象在编译期间具有已知的大小,甚至不需要动态分配。这让我想知道,
在哪些情况下,对象的自定义动态内存分配可能比从堆栈中分配对象更好? (编译时知道大小)
一个例子。如果Dog 是一个类,那么他们希望我们做的不仅仅是声明Dog puppy;
Dog* puppy = nullptr;
custom_alloc(puppy);
new(puppy) Dog(); // the constructor
// do stuff
puppy->~Dog(); // the destructor
custom_free(puppy)
我们不知道真正的custom_alloc 函数。为了使程序运行,给定的custom_alloc 函数将是malloc 的包装器。而custom_free 将是free 的包装器
我不喜欢这种方法,我想知道这在什么时候真正有用,或者他们真正想通过这样做来解决什么问题。
【问题讨论】:
-
一个原因是生命周期,另一个是堆栈大小限制
-
驱动开发(堆栈严重受限)。
-
如果分配/取消分配与正常的函数范围嵌套一致,那么一定要使用局部变量,但通常情况并非如此。
-
您遗漏了该代码中最丑陋的部分;必须手动触发析构函数。 Placement-new 有它的位置(不是双关语),但这些位置很少出现在正常的日常代码中。如果这是来自某些微控制器环境或某些其他特定情况的边缘情况,那是另一回事。你说“他们想让我们做......” - 你问他们(不管'他们'是谁)为什么?他们可能 (a) 有一些他们认为重要的原因,或者 (b) 没有人知道线索,但对于仍然在那里的人来说,这就是一直以来的方式。
-
我想知道为什么您的问题是关于“堆栈与自定义分配器”而不是“堆栈与堆”或“默认分配器与自定义分配器”?这个问题似乎缺少一个链接,这是
new/delete使用的默认动态分配器。我的意思是:您是在问“为什么要使用自定义动态分配器”还是“为什么要使用动态分配而不是堆栈”?
标签: c++ memory memory-management dynamic-memory-allocation static-memory-allocation