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请求或内联未标记的函数
衡量价值:使用性能分析工具确认内联是否带来实质性改进