【发布时间】:2021-03-20 02:33:00
【问题描述】:
我正在尝试通过编写一组用于管理动态数组的过程来学习 Ada,但我不知道如何去做。在 C++ 中,我可以轻松地将任意对象放入内存中,如下所示:
#include <new>
#include <iostream>
class object {
private:
int value;
public:
~object() noexcept { std::cout << "<> "; }
object(int value) noexcept : value(value) { std::cout << object::value << ' '; }
};
constexpr auto size = 16;
int main() {
auto buffer = static_cast<object*>(::operator new(size * sizeof(object)));
for (auto offset = 0; offset < size; offset++)
new (buffer + offset) object(offset);
for (auto offset = 0; offset < size; offset++)
(buffer + offset)->~object();
::operator delete(buffer);
}
在 Ada 中是否有类似“分配 x * sizeof(y) 并初始化 x y-items”的操作?
【问题讨论】:
-
Nitpick:如果你想学习如何用编程语言做某件事,通常最好用语言描述你想做的事情,而不是用另一种语言的代码来描述对可能回答您问题的人来说很熟悉。
-
您的主代码似乎分配了一个足够容纳 16 个“对象”的缓冲区,然后将该缓冲区的各个部分分配为单独的对象,将缓冲区用作内存池。在 Ada 中,我要么使用“存储池”概念,要么只分配一个类型为“对象数组(1..16)”的“对象池”。如果你更清楚地解释你想做什么,也许我可以更有帮助地回答。
-
在 Ada 中,这些常见的use cases for "placement new" 最好单独处理。
-
@NiklasHolsti 对不起,我应该用不同的措辞。我的意思是提前分配一个内存缓冲区,然后将可能不同类型的对象一个接一个地放入其中,就像在 C++ 中使用指针算术和放置 new 一样。
-
是的,但您为什么要这样做而不是仅仅使用
new?我认为Maxim’s answer 可能是最接近的 - 但要注意对齐问题
标签: c++ memory-management ada