首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >新的和新的表达

新的和新的表达
EN

Stack Overflow用户
提问于 2021-06-04 23:46:51
回答 4查看 460关注 0票数 0

同样,关于placement new,我在这个论坛上找到了这样一个例子:

代码语言:javascript
复制
char *buf  = new char[sizeof(string)]; // pre-allocated buffer
string *p = new (buf) string("hi");    // placement new
string *q = new string("hi");          // ordinary heap allocation

  • ,但我认为这里的buf是一个指针,指向已分配和构造的默认init字符的动态数组。因此,数组中的字符是默认初始化的,并且具有不确定的值。

  • 我猜使用第二行中的placement new将在以前构造的对象数组上构造对象。

  • 为什么用户不对数组分配调用operator new,而不使用new表达式?:

char *buf =static_cast(算子static_cast)

毕竟,如果

  • 是指向非默认可构造对象的动态数组的指针,那么代码将无法使用新表达式进行编译,而不是使用运算符新函数.

  • 我的猜测正确吗?

以下是通往最初答案的链接:

What uses are there for "placement new"?

EN

回答 4

Stack Overflow用户

发布于 2021-06-05 01:32:48

为什么用户没有在数组分配中调用运算符,而不是使用新表达式?:

我们不能回答这个问题,因为我们不是那个用户。你应该从用户那里问这个问题--尽管这个例子是1998年写的,但联系他们可能并不容易。我猜:他们不知道非位置操作符新的存在,或者他们不知道它是用来做什么的。在这种情况下,重用char数组的内存是一种直观的选择。

请注意,创建单个动态std::string对象的示例一开始就没有什么意义(我假设这就是示例中的string )。

我有一个类似的问题要问您:为什么您在建议中使用operator new[]而不是operator new?更重要的是,为什么不使用分配器呢?

我的猜测是正确的吗?

  1. Correct.
  2. Correct.
  3. This是一个问题,而不是猜测。我把它写在上面了,

  1. ,它会失败。但这与constructible.

无关,因为char是默认的

票数 2
EN

Stack Overflow用户

发布于 2021-06-05 02:46:01

char是一个既基本又琐碎的对象类型。在实践中,创建一个内存并不会触碰内存,而创建一个数组也不会。

代码语言:javascript
复制
char* foo = new char[10];

代码语言:javascript
复制
char *foo  = static_cast<char*>(operator new[](10));

最后在机器代码中做完全相同的事情,除了第二件事情要冗长得多。

抽象机器中有一些细微的差别;在一个机器中创建了一堆字符,在另一个字符中,它们不在这一行上。在这种情况下,这需要进行相当多的语言律师工作(我认为处理方式可能不同,某些访问可能会有所不同,特别是在c++修复malloc问题之前的标准版本中)。

毕竟,如果

是一个指向非默认可构造对象的动态数组的指针,那么代码将无法使用新表达式进行编译,而不是使用运算符新函数。

当然,但是转换将是代码嗅觉,buf的重点是为以后的新位置存储。我想已经是了,

代码语言:javascript
复制
void *foo  = operator new[](10);

更少的精神错乱。

仅仅因为你可以静态转换并不意味着你应该。

票数 2
EN

Stack Overflow用户

发布于 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的数据存储仍然像往常一样-它在动态内存中分配字符数据。为了使用一些内存池,程序员应该提供适当的分配器,这是放置新操作符的目的之一。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67845086

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档