GCC拒绝内联请求
gcc denying inline request
#include <iostream>
using namespace std;
inline int square(int n)
{
return n * n;
}
int main(void)
{
cout << square(2) << endl;
}
通过使用gcc编译代码,我发现编译器仍然将平方函数视为简单函数而不是内联函数。
(我检查了汇编代码,在那里我看到对平方函数的调用。这就是为什么我知道它没有将它视为内联的。)
为什么它拒绝我的请求使内联的函数,即使它是一个简单的函数?如果gcc拒绝内联这样一个简单的函数,那么内联关键字的用途是什么?
我可以强制内联函数;这不是问题所在。我只是想知道为什么gcc拒绝我的请求。
inline
在现代主流编译器上基本上是被忽略的(它只是允许对函数的ODR进行通常的豁免)。优化器无论如何都会做他的事情,而且它可能比你我更清楚(尽管通常有一些特定于编译器的标志来强制函数内联)。
无论如何,您可能没有看到任何内联,因为您在编译时禁用了优化—这是在调试中经常使用的设置,其中内联和其他优化使得不可能将源行与编译代码匹配(从而在调试器中逐步执行)。在我的机器(g++ 4.8.4)上启用优化-O3
使函数完全消失-结果(4
)在编译时被完全计算。
总而言之:目前,inline
的要点是允许您在多个翻译单元中提供函数定义,而不会出现函数的多个定义的链接错误。
这是有用,因为如果你有一个很好的候选人内联你想把它放到头文件(这样编译每个.cpp
编译器可以马上看到它的定义,并扩大它内联马上——链接时代码生成只是最近的事情)但是你想让链接器知道额外的非inline
副本参考都出现同样的事情,并且可以丢弃安全(将它们标记为static
会导致不必要的代码重复在每个你)。
编译时没有启用优化。即使使用-O1
,您的代码也会编译为相当于
int main () {
std::cout << 4;
}
同样,不要担心哪些应该内联,哪些不应该,让编译器为你做这些。它方式好。(一如既往,除非您通过度量证明编译器是错误的。)
编译优化,例如g++ -O3 ...
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- 访问被拒绝后,c++中的故障保护代码
- 如何在boost beast http请求中设置http头
- 发送一个带有libcurl C++问题的帖子请求:s
- 在多个核心中处理一个HTTP请求
- IpOpt拒绝解决不受约束的问题
- Termux权限被拒绝
- AWS Lambda C++运行时权限被拒绝
- WinSock2:connect() 提供"连接被拒绝"
- 为什么 KMS drmModeSetCrtc() 在 X11 会话中运行时会失败并被拒绝权限?
- 错误:请求非类类型为"MULTIMEDIA_FILME [500]"的成员|
- 使用 Winsock2.h C++向不和谐 API 发送 HTTP 请求时出现问题
- 每个服务器请求的内存预算
- 删除目录函数访问被拒绝
- 模板签名解析为 void(void) 被 GCC 拒绝;这是否有效C++?
- std::getline没有在while循环中重新请求用户输入
- 为什么 Windows 拒绝访问某些进程的名称?
- std::stoi 的版本拒绝任何非数字
- 整数输入 拒绝非整数输入并在C++中请求另一个输入
- GCC拒绝内联请求