首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >_Znwm和_Znam的功能在c++中相同吗?

_Znwm和_Znam的功能在c++中相同吗?
EN

Stack Overflow用户
提问于 2020-03-22 03:53:47
回答 1查看 474关注 0票数 0

我最近使用了llvm,我发现cpp中的新语句在llvm中被转换为_Znam,我知道cpp中的new也调用函数_Znwmnew []调用_Znam,那么这两个函数的功能之间有什么区别呢?如果我使用_Znwm为数组分配空间怎么办?

示例

代码语言:javascript
运行
复制
a = new int*[10];

编译为

代码语言:javascript
运行
复制
%2 = call i8* @_Znam(i64 80) #2
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-03-22 04:01:19

_Znwm_Znam只是函数的错误名称

代码语言:javascript
运行
复制
operator new(std::size_t)

代码语言:javascript
运行
复制
operator new[](std::size_t)

分别使用。

一个(非布局)数组新表达式调用后者,而一个(非放置)非数组新表达式调用前者来分配内存。

这些函数可以由用户替换,但是标准库提供了默认的实现。数组版本的默认实现只是调用非数组版本,因为C++11和非数组版本分配了传入大小的内存,并以某种未指定的方式适当地对齐所有非对齐类型,如果分配失败,则抛出异常std::bad_alloc,否则将非空指针返回到分配块的开头。

因此,它的行为类似于std::malloc,只不过后者在分配失败时返回一个空指针,而不是抛出异常。默认的operator new实现只是在内部使用malloc来执行分配,这是未指定的,但很可能是这样。

malloc不应该调用operator newoperator new[],所以我不知道为什么您认为它会在IR中转换为。

我不认为这里有任何关于LLVM的东西。调用哪个分配函数由C++标准指定。只有名称是以实现定义的方式损坏的。

还要注意的是,这些调用并不是新表达式所转换的全部内容。调用operator new/operator new[]之后,新表达式还将在内存中构造对象,这可能需要对值的存储进行构造函数调用。

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

https://stackoverflow.com/questions/60795784

复制
相关文章

相似问题

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