`operator new`是如何在链接器级别实现的?

问题描述 投票:0回答:1

根据 C++ 文档

operator new
/等。功能是:

在每个翻译单元中隐式声明[,并且]如果程序中为任何可替换分配函数提供了多个替换,则程序格式错误[...]。

也就是说,如果程序员没有定义自己的

operator new
,那么C++标准库必须提供它。相反,如果他们确实提供了它,那么标准库一定不能

我理解这种行为,但我理解的是它在链接器级别是如何工作的。

C++ 标准库是在使用它的程序之前编译的,这是程序员决定是否定义自己的

operator new
。因此,C++ 标准库确实需要在某处推测性地提供
operator new
。但是,当用户的程序链接到标准库时,如果他们did定义了自己的分配函数,那么这将导致多个定义并与上面的文档发生冲突(实际上,您会收到关于重复的链接器错误)符号,谢天谢地)。

相反,如果标准库没有定义了

operator new
,那么用户当然必须这样做,否则对它的任何调用都将导致丢失符号(因此会导致链接器错误) .

c++ linker language-lawyer new-operator
1个回答
0
投票

至少对于 gcc/clang,您可以使用 __attribute__((weak)) 将符号定义为

weak

对频时如果同时存在展位弱和正常符号,则正常符号优先。因此弱符号可以充当“默认”或“后备”。

标准库可以将

operator new
定义为弱,使用户空间应用程序有机会覆盖它,但如果没有,则使用该库的符号,因此避免未定义的引用和多重定义错误。

相同的机制通常适用于系统调用,在单元测试期间进行模拟非常方便。

© www.soinside.com 2019 - 2024. All rights reserved.