如何强制函数的内联,但在C++文件中定义它呢?
这是过去曾问过的一个问题,例如:Moving inline methods from a header file to a .cpp files
简而言之,这里的答案如下:“内联过去意味着以牺牲.text大小为代价删除函数调用开销,现在它意味着放松ODR,所以不要将内联用于任何与ODR无关的事情,编译器更清楚这一点”。
我知道这一点,然而,在我有点异国情调的情况下,我不关心性能。
我正在编写一个嵌入式设备,如果有人突破了其他的安全层,我想让它尽可能地令人讨厌地反向设计代码的这一部分,这意味着我不希望函数调用(无论如何也不会被多次调用)公开函数边界,这是代码片段的自然分隔,这些代码可以自己实现一些功能。
但是,我也希望保持代码的有序性,并且在我的头文件中没有代码。
我看到可以使用__attribute((force_inline))
强制内联,但如果这些函数也没有inline
属性,则会收到警告:warning: always_inline function might not be inlinable [-Wattributes]
关闭属性警告是一种选择,但我宁愿只在我确信没有干净的方法可以做到这一点之后才使用它。
因此,问题是:如何才能有一个强制内联的函数,其声明在头中,但定义在源文件中,而不禁用所有属性警告?这不可能吗?
发布于 2022-04-17 23:05:43
内联只能被问。有时候有点强悍。但是,您永远不能保证函数最终会内联,因为原因有时很模糊。
在这里,MSVC文档说明了什么(我突出了重要的部分):
编译器将内联扩展选项和关键字作为建议。不能保证函数是内联的。您不能强迫编译器内联一个特定的函数,即使使用__forceinline关键字。在使用/clr编译时,如果有应用于该函数的安全属性,编译器将不会内联该函数。
C++标准说:
--无论您如何将函数指定为内联函数,它都是允许编译器忽略的请求:编译器可能会内联--扩展一些、全部或没有调用指定为内联的函数的位置。
GCC的文档对于不可否认的功能不太清楚,但情况还是存在的。
强制内联的唯一“真正”方法是非常丑陋的,因为它在编译之前依赖于内联.是的,老式的预处理宏。邪恶本身。或者使用带有替换函数调用的#include
的脏黑客(并插入C++代码).对于双重评估而言,这可能比宏观安全一些,但其他副作用可能更糟,因为它必须依赖“全局”变量才能发挥作用。
值得这样的痛苦吗?可能不会。特别是“混淆”,因为它不会像你想的那样“安全”。是的,显式函数调用更容易跟踪。但这不会改变任何事情:逆向工程不依赖于这样做。事实上,混淆几乎不是好事(甚至是工作.)解决方案。我以前以为..。很久很久以前。我向自己证明了它几乎是无用的。我自己的“安全”密码。打破密码我花的时间比我“保护”它的时间要少得多.
https://stackoverflow.com/questions/71905732
复制相似问题