【问题标题】:What is __builtin_operator_new and how it works?什么是 __builtin_operator_new 以及它是如何工作的?
【发布时间】:2019-10-15 09:05:09
【问题描述】:

在浏览 libc++ 代码时,我看到 ndk 分配器 __allocate 函数正在调用 __builtin_operator_new,但我在 libc++ 代码中找不到它的定义。

从名字上可以看出它是内存分配函数。但谁来实施呢?它是由像clang,gcc这样的编译器定义的吗?在哪里可以找到它的定义?

【问题讨论】:

  • 嗯,clang 是开源的,所以你可以搜索它的代码,看看符号是否在那里。按照定义,内置插件是编译器内置的东西,所以它看起来是个不错的地方。
  • 请注意,这是特定于您正在使用的特定编译器的实现细节。如果你想编写可移植的 C++,你应该假装你对它们一无所知

标签: c++ clang libc++


【解决方案1】:

它是一个内在的,由编译器本身隐式定义(因此它被称为内置)。在 Clang 的语言扩展部分是 documented

__builtin_operator_new 和 __builtin_operator_delete

__builtin_operator_new 分配内存就像一个非放置非类 new 表达式。这与直接调用普通的非放置 ::operator new 完全一样,除了它允许 C++ 标准不允许直接调用 ::operator new 的某些优化(特别是删除新/删除对和合并分配) .

同样,__builtin_operator_delete 像非类删除表达式一样释放内存,并且与直接调用普通 ::operator delete 完全相同,只是它允许优化。目前只有未调整大小的__builtin_operator_delete 可用。

这些内置函数旨在用于实现std::allocator 和其他类似的分配库,并且仅在 C++ 中可用。

【讨论】:

  • 最奇特的......你会知道为什么标准禁止“删除新/删除对和合并分配”吗?
  • @nada - 我必须深入研究才能找到答案。但如果你很好奇,在我看来,发布一个关于它的新问题是值得的。
  • 谢谢。我为此做了一个short question
猜你喜欢
  • 2020-08-06
  • 2013-01-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-14
  • 2014-11-15
  • 2014-01-09
  • 1970-01-01
相关资源
最近更新 更多