gpt4 book ai didi

c++ - 空内联函数到底发生了什么?

转载 作者:太空狗 更新时间:2023-10-29 23:51:22 25 4
gpt4 key购买 nike

我正在编写代码(使用 GCC 4.7.2),在测试阶段我在代码的无数位置记录了过多的内容。这些日志记录应该会在发布的二进制文件中消失。

我正在通过类似 void log(std::string msg); 的函数进行日志记录。由于这些函数调用很多,并且通过整个代码分布在许多文件中,所以我想将其设为内联函数,并为其提供一个空主体以用于发布二进制文件。

不,我的问题是:编译器用它做什么?二进制文件是否仅包含没有函数的其余代码,是否包含 nop 或其他任何内容?我可以通过清空内联日志记录功能来完全消除二进制文件中的日志记录代码吗?

我不仅对解决问题的答案感兴趣,而且对编译器的行为本身也很好奇。

最佳答案

如果您想要在调试和发布之间使用不同的代码,那么这是预处理器的理想用例:

#ifdef NDEBUG
#define log(ignored)
#endif

那么您就不会将任何东西留给编译器。你保证只有调试版本会有额外的调用。这也是 assert 的工作方式。

请注意,这也会放弃参数计算。例如,如果您有 log(get_msg()),那么宏方法也会放弃对 get_msg() 的调用。这可能是可取的,但您需要意识到这一点。

至于inline,这完全取决于编译器。 inline 关键字本身只是一个提示,它并不强制编译器做任何事情。编译器对是否内联特定函数(包括未标记为 inline 的内联函数)执行自己的优化计算。这通常意味着足够高的优化级别(即 -O3),并且内联函数的主体在该特定编译单元中可见。例如,如果编译器只看到声明但(可能是空的)函数体在不同的 .cpp 文件中,则它不能内联。但是,是的,如果编译器确定没有副作用,它可以自由地让整个函数消失。

但同样,当预处理器提供如此干净且广泛使用的解决方案时,没有理由依赖它。

关于c++ - 空内联函数到底发生了什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21657455/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com