替换函数'operator new'不能声明'inline' [-werror,-winline-new-delete]

replacement function 'operator new' cannot be declared 'inline' [-Werror,-Winline-new-delete]

本文关键字:-werror -winline-new-delete inline 不能 函数 operator new 替换 声明      更新时间:2023-10-16

我在使用clang时遇到了这个错误。为什么运算符new不能内联声明?

./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__))
                  ^

整个程序中分配函数的所有使用都必须兼容。在一个翻译单元中用operator new分配的东西必须与另一个TU中的operator delete不可分配。因此,程序必须在任何地方都有相同的实现,并且分配函数的替换不是TU的本地事务,而是全局选择。

因此,与其要求每个TU都包含相同的代码(这将破坏无声、非侵入性替换的目的,违反这种目的将极难诊断(,不如要求该功能具有外部链接,而不是内联。

将分配函数视为程序全局状态的一部分。

由于以下缺陷报告而被禁止:

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

原因是:

现有实现不允许内联函数作为替换内存分配功能。提供此功能将在某些情况下是困难的,并且被认为价值有限。

因此,最初的标准基本上没有任何偏好,因此,由于难以实现,实现选择了不允许它,因此标准也效仿并禁止了它。