同样,关于placement new,我在这个论坛上找到了这样一个例子:
char *buf = new char[sizeof(string)]; // pre-allocated buffer
string *p = new (buf) string("hi"); // placement new
string *q = new string("hi"); // ordinary heap allocationbuf是一个指针,指向已分配和构造的默认init字符的动态数组。因此,数组中的字符是默认初始化的,并且具有不确定的值。new将在以前构造的对象数组上构造对象。operator new,而不使用new表达式?:char *buf =static_cast(算子static_cast)
毕竟,如果
。
以下是通往最初答案的链接:
发布于 2021-06-05 01:32:48
为什么用户没有在数组分配中调用运算符,而不是使用新表达式?:
我们不能回答这个问题,因为我们不是那个用户。你应该从用户那里问这个问题--尽管这个例子是1998年写的,但联系他们可能并不容易。我猜:他们不知道非位置操作符新的存在,或者他们不知道它是用来做什么的。在这种情况下,重用char数组的内存是一种直观的选择。
请注意,创建单个动态std::string对象的示例一开始就没有什么意义(我假设这就是示例中的string )。
我有一个类似的问题要问您:为什么您在建议中使用operator new[]而不是operator new?更重要的是,为什么不使用分配器呢?
我的猜测是正确的吗?
,
无关,因为char是默认的
发布于 2021-06-05 02:46:01
char是一个既基本又琐碎的对象类型。在实践中,创建一个内存并不会触碰内存,而创建一个数组也不会。
char* foo = new char[10];和
char *foo = static_cast<char*>(operator new[](10));最后在机器代码中做完全相同的事情,除了第二件事情要冗长得多。
抽象机器中有一些细微的差别;在一个机器中创建了一堆字符,在另一个字符中,它们不在这一行上。在这种情况下,这需要进行相当多的语言律师工作(我认为处理方式可能不同,某些访问可能会有所不同,特别是在c++修复malloc问题之前的标准版本中)。
毕竟,如果
是一个指向非默认可构造对象的动态数组的指针,那么代码将无法使用新表达式进行编译,而不是使用运算符新函数。
当然,但是转换将是代码嗅觉,buf的重点是为以后的新位置存储。我想已经是了,
void *foo = operator new[](10);更少的精神错乱。
仅仅因为你可以静态转换并不意味着你应该。
发布于 2021-06-05 00:04:12
operator new[](sizeof(string)) --这很奇怪,它创建对象的语法不正确。在最好的情况下,它隐式地在内存中创建一个对象(如果操作符new实现为std::malloc调用和对象是POD类型),而不初始化或构造对象。在这种情况下,您所能做的就是static_cast<char*>(new string);,提供的行只会在动态存储中创建一个string对象,然后通过用char*替换指针类型使其匿名。
问题是,为了放置新的buf,不需要指向动态内存。它可以是一个静态buffer.It,它可以是一个指针,指向用于存储多个对象(一个内存池)的相当大的存储空间中的内存位置。新的对象将在给定的位置构建。
请注意,如果放置新std::string的数据存储仍然像往常一样-它在动态内存中分配字符数据。为了使用一些内存池,程序员应该提供适当的分配器,这是放置新操作符的目的之一。
https://stackoverflow.com/questions/67845086
复制相似问题