闽公网安备 35020302035485号
3.编译器能够进行全程序分析并确定具体类型的特殊情况下
#include <iostream>
usingnamespacestd;
class Base {
public:
// 声明为虚函数,同时标记为内联
inline virtual void who() {
cout << "我是Base类" << endl;
}
virtual ~Base() {}
};
class Derived :public Base {
public:
// 派生类重写的虚函数,隐式内联
inline void who() override {
cout << "我是Derived类" << endl;
}
};
int main() {
// 场景1:通过具体对象调用 - 可以内联
Base b;
b.who(); // 编译时已知调用Base::who()
// 堆代码 duidaima.com
// 场景2:通过指针调用 - 不能内联
Base* ptr = new Derived();
ptr->who(); // 运行时才确定调用Derived::who()
delete ptr;
return0;
}
在这个例子中:ptr->who()调用不能被内联,因为编译器无法在编译期确定ptr指向哪种类型
#include <iostream>
#include <string>
usingnamespacestd;
class LoggerBase {
protected:
string prefix;
public:
LoggerBase(conststring& p) : prefix(p) {}
// 基类的虚函数,处理共同的日志前缀
inline virtual void formatPrefix(ostream& out) const {
out << "[" << prefix << "] ";
}
// 纯虚函数,子类必须实现
virtual void log(const string& message) = 0;
virtual ~LoggerBase() {}
};
class DebugLogger :public LoggerBase {
public:
DebugLogger() : LoggerBase("DEBUG") {}
void log(const string& message) override {
cout << "调试输出: ";
// 这里静态调用基类方法 - 可以内联
LoggerBase::formatPrefix(cout);
cout << message << endl;
}
};
class ErrorLogger :public LoggerBase {
public:
ErrorLogger() : LoggerBase("ERROR") {}
void log(const string& message) override {
cerr << "错误输出: ";
// 同样可以内联
LoggerBase::formatPrefix(cerr);
cerr << message << endl;
}
};
int main() {
// 直接对象调用 - 可内联
DebugLogger debug;
debug.log("这是一条调试信息");
// 通过基类指针调用 - 不可内联log(),但内部的formatPrefix()调用可内联
LoggerBase* logger = new ErrorLogger();
logger->log("发生严重错误");
delete logger;
return0;
}
这个例子展示了实际开发中的一个重要设计模式:基类提供部分实现(可内联),派生类负责特定实现。当派生类调用基类的虚方法时,这些调用可以被内联,提高性能。3.在确定的优化级别下可能忽略inline请求或内联未标记的函数
衡量价值:使用性能分析工具确认内联是否带来实质性改进