替换函数'operator new'不能声明为'inline' [-Werror,-Winline-new-delete]

5
我在使用clang时遇到了这个错误。为什么无法将operator new声明为inline?
./test.h:198:1: error: replacement function 'operator new' cannot be declared 'inline' [-Werror,-Winline-new-delete]
__forceinline void *operator new(size_t size) { return malloc(size); }
^
./test.h:18:23: note: expanded from macro '__forceinline'
#define __forceinline inline __attribute__((__always_inline__))

                  ^

1
因为标准是这样规定的。 - Kerrek SB
但是为什么标准禁止这样做呢? - wincmder
2个回答

4
你的整个程序中使用的分配函数必须是兼容的。在一个翻译单位中使用operator new分配的内存必须能够在另一个翻译单位中使用operator delete释放。因此,程序的实现必须在任何地方都是相同的,替换分配函数不是翻译单元本地问题,而是全局选择。
因此,要求不是要求每个翻译单元都包含相同的代码(这将违背静默、非侵入式替换的目的,并且违反该要求会非常难以诊断),而是要求该函数具有extern链接并且不是inline。
把分配函数看作程序全局状态的一部分。

0
这是因为这个缺陷报告而被禁止的。

https://cplusplus.github.io/LWG/issue404

原因是:
现有的实现不允许内联函数作为替代内存分配函数。在某些情况下,提供这个功能会很困难,并且被认为具有有限的价值。
所以基本上原始标准没有偏好,结果实现选择不允许它,因为实现它很困难,所以标准也跟着禁止了它。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接