24.7.10_C学习记录

问题一:我在头文件里声明函数,这个函数是否是静态函数有什么区别?

在C或C++中,当您在头文件(.h 或 .hpp)中声明一个函数,该函数是否被声明为静态的(使用static关键字)对函数的行为和可见性有重要影响。以下是静态函数和非静态(全局或普通)函数之间的主要区别:

非静态函数

当您在头文件中声明一个非静态函数时,这意味着函数具有外部链接性(external linkage)。这意味着:

  • 函数可以在多个源文件(.c 或 .cpp)中被引用。
  • 函数声明(prototype)可以被其他源文件看到,只要它们包含了相同的头文件。
  • 函数的定义必须出现在某个源文件中,且在整个程序中是唯一的。

静态函数

当您在头文件中声明一个静态函数时,尽管不常见,但这种做法确实有其用途。静态函数具有内部链接性(internal linkage),意味着:

  • 函数只在其定义的源文件中可见和可访问。
  • 即使其他源文件包含了相同的头文件,也无法访问该静态函数。
  • 这种声明方式通常用于实现仅在单个源文件中使用的辅助函数或私有函数。

示例

假设您有以下头文件myheader.h

#ifndef MYHEADER_H
#define MYHEADER_H

// 非静态函数声明
void nonStaticFunction();

// 静态函数声明,通常不会这样写,这里只是为了示例
static void staticFunction();

#endif // MYHEADER_H

然后,在源文件main.cpp中:

#include "myheader.h"

int main() {
    nonStaticFunction(); // 可以调用
    // staticFunction(); // 编译错误,因为静态函数不可见
}

总结

  • 非静态函数允许跨源文件的调用,而静态函数限制了函数的作用范围到其定义的源文件内。
  • 非静态函数需要在某个源文件中定义,而静态函数同样需要定义,但只能在同一个源文件中访问。

在实践中,静态函数通常直接在源文件(.cpp 或 .c)中声明和定义,而不是放在头文件中,以保持封装性和减少命名冲突的风险。然而,在某些情况下,如模板类的内联静态成员函数,可能会在头文件中声明和定义。

问题二:什么是内敛函数? 

内敛函数(inline function)是C++中的一种特殊类型的函数,其设计目的是为了提高程序的执行效率。当一个函数被声明为内联(inline),编译器会尝试在调用该函数的位置直接嵌入或“展开”函数的代码,而不是执行传统的函数调用过程。这样做可以避免函数调用的开销,比如保存和恢复寄存器状态、参数传递、返回地址的保存等,从而理论上可以提高程序的运行速度。

内联函数的关键特性包括:

  1. 代码内联:内联函数的代码在调用点处被复制,避免了函数调用的额外开销。

  2. 使用inline关键字:在函数声明前使用inline关键字可以告诉编译器这是一个内联函数。

  3. 编译器优化:虽然程序员可以通过使用inline关键字建议编译器将函数内联,但最终是否内联是由编译器决定的。编译器可能会根据函数的大小、复杂度以及调用频率等因素判断是否进行内联优化。

  4. 函数体必须在头文件中:如果一个内联函数的定义不在类的主体内,那么它的定义通常需要放在头文件中,以便所有包含该头文件的源文件都可以访问到函数的完整定义。

  5. 限制条件:内联函数不能包含循环、递归或复杂的控制流结构,因为这些结构会导致代码膨胀,反而可能降低性能。

  6. 代码膨胀:内联函数可能导致生成的可执行文件体积增大,因为同一段代码在多个位置被重复。

  7. 调用频率:内联函数最适合那些小而频繁调用的函数,以最大化性能提升。

inline int add(int x, int y) {
    return x + y;
}

  • 20
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值