我最近使用了llvm,我发现cpp中的新语句在llvm中被转换为_Znam
,我知道cpp中的new
也调用函数_Znwm
,new []
调用_Znam
,那么这两个函数的功能之间有什么区别呢?如果我使用_Znwm
为数组分配空间怎么办?
示例
a = new int*[10];
编译为
%2 = call i8* @_Znam(i64 80) #2
发布于 2020-03-22 04:01:19
_Znwm
和_Znam
只是函数的错误名称
operator new(std::size_t)
和
operator new[](std::size_t)
分别使用。
一个(非布局)数组新表达式调用后者,而一个(非放置)非数组新表达式调用前者来分配内存。
这些函数可以由用户替换,但是标准库提供了默认的实现。数组版本的默认实现只是调用非数组版本,因为C++11和非数组版本分配了传入大小的内存,并以某种未指定的方式适当地对齐所有非对齐类型,如果分配失败,则抛出异常std::bad_alloc
,否则将非空指针返回到分配块的开头。
因此,它的行为类似于std::malloc
,只不过后者在分配失败时返回一个空指针,而不是抛出异常。默认的operator new
实现只是在内部使用malloc
来执行分配,这是未指定的,但很可能是这样。
malloc
不应该调用operator new
或operator new[]
,所以我不知道为什么您认为它会在IR中转换为。
我不认为这里有任何关于LLVM的东西。调用哪个分配函数由C++标准指定。只有名称是以实现定义的方式损坏的。
还要注意的是,这些调用并不是新表达式所转换的全部内容。调用operator new
/operator new[]
之后,新表达式还将在内存中构造对象,这可能需要对值的存储进行构造函数调用。
https://stackoverflow.com/questions/60795784
复制相似问题