C/C++中的内建函数介绍:介绍C/C++中内建函数的基本概念、用途和作用

简介: C/C++中的内建函数介绍:介绍C/C++中内建函数的基本概念、用途和作用

引言

C/C++是一种广泛使用的编程语言,它们提供了许多内建函数来帮助开发人员更高效地编写代码。这些内建函数可以大大简化程序的开发和维护,提高程序的性能和可靠性。
本文将介绍C/C++的一些常用内建函数,包括标准库函数和编译器扩展函数。我们将会讨论它们的作用、使用方法以及一些注意事项。希望本文能对广大开发人员有所帮助。



C/C++的内建函数可以分为两类:标准库函数和编译器扩展函数。
标准库函数是C/C++语言提供的标准函数库,包含了大量常用的函数,例如字符串处理、数学运算、文件操作等。标准库函数的使用方法可以参考C/C++语言的相关教程和文档,例如C++ Primer、C++标准库等书籍。
编译器扩展函数是由特定编译器提供的一些额外的函数,通常用于实现一些特定的功能或优化。编译器扩展函数的使用方法和语法可能有些不同,具体可以参考不同编译器的文档和手册。


以下是一些常用的C/C++编译器扩展函数及其对应的编译器:
GCC编译器:具有大量的扩展函数,例如__builtin_expect、__builtin_popcount等。可以参考GCC官方文档进行查阅。
Clang编译器:支持大量的GCC扩展函数,并且提供了一些自己的扩展函数,例如__builtin_assume_aligned、__builtin_bswap等。可以参考Clang官方文档进行查阅。
Visual C++编译器:提供了一些内建函数和宏,例如__assume、__cpuid等。可以参考Visual C++官方文档进行查阅。
另外,网上也有很多关于C/C++内建函数的资料和教程,例如C++ Reference、cppreference.com等。可以根据自己的需要进行查找和学习。


使用内建函数的好处

  • 高效:内建函数通常由编译器或操作系统提供,它们经过了高度优化和测试,因此执行速度很快,比自己编写的函数更加高效。
  • 可靠:内建函数经过了广泛的测试和验证,具有较高的可靠性和稳定性,可以保证其正确性和安全性。
  • 易用:内建函数通常具有直观的接口和语义,可以方便地使用,而且它们已经被广泛使用和熟悉,因此可以节省开发时间和减少错误。
  • 可移植:内建函数是标准化的,可以在不同的操作系统和编译器中使用,具有较高的可移植性和兼容性。
  • 可读性强:使用内建函数可以使代码更加简洁和易读,因为内建函数通常具有良好的命名和语义,可以更清晰地表达代码的意图。

总之,使用 C/C++ 内建函数可以提高代码的效率、可靠性、可移植性和可读性,是编写高质量、高效率的代码的重要手段之一。


  • 内建函数的优化

内建函数通常是由编译器实现的特殊函数,可以使用特殊的汇编指令或硬件加速等技术来优化,并且不需要将函数体替换到函数调用处,因此,与内联函数不同,内建函数的优化通常不会导致代码膨胀的问题。

C/C++标准库函数

C/C++标准库相信大家都比较熟悉了就不一一介绍了,另外说明一下,在 C++ 标准库中,类模板和函数模板都不是内建函数。内建函数是指 C++ 语言本身就提供的函数,如 sizeof、typeid、new、delete 等等。


  • C语言中的内建函数
  • 输入输出相关:scanf、printf、getchar、putchar、gets、puts等。
  • 数学计算相关:abs、sqrt、pow、exp、log、sin、cos等。
  • 字符串相关:strlen、strcpy、strcmp、strstr、strchr等。
  • 内存操作相关:memcpy、memset、malloc、calloc、realloc等。
  • 类型转换相关:atoi、atof、itoa等。
  • 时间日期相关:time、asctime、ctime、strftime等。
  • 文件操作相关:fopen、fclose、fread、fwrite、fgets、fputs等。

需要注意的是,这里列举的仅是部分内建函数,实际上C语言标准库中自带了很多函数,使用者可以通过查阅相关文档来了解更多。


  • C++ 中的内建函数
  • 输入输出相关:cin、cout、cerr、clog、scanf、printf等。
  • 数学计算相关:abs、sqrt、pow、exp、log、sin、cos等。
  • 字符串相关:strlen、strcpy、strcmp、strstr、strchr等。
  • 内存操作相关:memcpy、memset、malloc、calloc、realloc等。
  • 类型转换相关:static_cast、dynamic_cast、reinterpret_cast、const_cast等。
  • 异常处理相关:try、catch、throw等。
  • 其他常用函数:exit、rand、time、assert等。

需要注意的是,这里列举的仅是部分内建函数,实际上C++语言内置了很多函数,使用者可以通过查阅相关文档来了解更多。


  • C++ 标准库中的组件
  • 类模板:如 std::string、std::vector、std::map 等等,用于表示不同类型的对象。
  • 函数模板:如 std::sort、std::max、std::unique 等等,用于对不同类型的对象进行操作。
  • 类型定义:如 std::size_t、std::nullptr_t、std::chrono::duration 等等,用于定义不同类型的数据。
  • 函数对象:如 std::plus、std::less、std::function 等等,用于表示可调用对象。
  • 输入输出流:如 std::cin、std::cout、std::fstream 等等,用于输入输出数据。

以上这些组件都不是内建函数,它们都需要在程序中显式包含相应的头文件才能使用。需要注意的是,有些头文件中可能会包含内建函数的声明,但这并不意味着这些函数就是 C++ 标准库中的组件。


GCC内建函数

GCC是一个流行的C和C++编译器,它支持许多内置函数,这些函数可以帮助程序员编写高效的代码。本文将介绍GCC的一些常用内置函数,包括__builtin_expect、__builtin_popcount、__builtin_prefetch和其他函数。


  • __builtin_expect

__builtin_expect函数用于提示编译器一个条件表达式的期望结果,使用__builtin_expect函数可以帮助编译器优化分支预测,从而提高程序的性能。
它的原型如下:

long __builtin_expect(long exp, long c);
//其中,exp是条件表达式,c是期望的结果。

  • __builtin_popcount

__builtin_popcount函数用于计算一个整数中二进制位为1的个数,该函数可以用于位运算和图形处理等场景,可以提高程序的性能。
它的原型如下:

int __builtin_popcount(unsigned int x);

  • __builtin_prefetch

__builtin_prefetch函数用于预取一个内存地址的数据。它的原型如下:,使用__builtin_prefetch函数可以帮助程序员更好地利用CPU的预取功能,提高程序的性能。
它的原型如下:

void __builtin_prefetch(const void *addr, int rw, int locality);
//其中,addr是要预取的内存地址,rw指定预取的数据是读取还是写入,locality指定预取数据的局部性,可以是0、1或2。>  ```

  • 其他函数

除了上述函数外,GCC还提供了许多其他的内置函数,例如__builtin_ctz__builtin_clz等。
这些函数可以帮助程序员更好地编写高效的代码。


  • GCC编译器内置函数的官方文档地址:

Other Built-in Functions Provided by GCC 12.2.0
该文档详细介绍了GCC编译器支持的所有内置函数,包括函数的语法、用法和实例等。如果你需要了解GCC编译器的内置函数,可以通过该文档进行查阅。


Clang内建函数

Clang是一个流行的C和C++编译器,它支持许多内置函数,这些函数可以帮助程序员编写高效的代码。本文将介绍Clang的一些常用内置函数,包括__builtin_assume_aligned__builtin_bswap__builtin_trap和其他函数。


  • __builtin_assume_aligned

__builtin_assume_aligned函数用于告诉编译器一个指针是对齐的。
它的原型如下:

void * __builtin_assume_aligned (void *ptr, size_t align);
//其中,ptr是要对齐的指针,align是对齐要求,必须是2的幂。

  • __builtin_bswap

__builtin_bswap函数用于交换一个整数的字节序。它的原型如下:
它的原型如下:

unsigned int __builtin_bswap32(unsigned int x);
unsigned long long __builtin_bswap64(unsigned long long x);
//其中,__builtin_bswap32用于交换32位整数的字节序,__builtin_bswap64用于交换64位整数的字节序。

  • __builtin_trap

__builtin_trap函数用于生成一个陷阱指令,它会使程序停止执行并进入调试模式。
它的原型如下:

void __builtin_trap (void);
//该函数可用于调试程序,例如在程序中加入一个断点。

  • 其他函数

除了上述函数外,Clang还提供了许多其他的内置函数,例如__builtin_popcount__builtin_ctz等,这些函数可以帮助程序员更好地编写高效的代码。


  • Clang编译器内建函数的官方文档地址

Clang Language Extensions/Builtin Functions
该文档列出了所有内置函数,按照字母顺序进行排列,每个函数的用法、参数、返回值都有详细的说明,非常全面和详细。如果需要了解某个内置函数的具体用法,可以在该文档中查找相应的信息。
此外,Clang编译器还提供了其他一些扩展,如语句表达式、语句标签、变量长度数组等等,这些扩展也有详细的说明,可以在同一文档中查找。


Visual C++内建函数

Visual C++是微软公司推出的一款C++编译器,它与C/C++标准库一起提供了许多内建函数来帮助开发人员更高效地编写代码。这些内建函数可以大大简化程序的开发和维护,提高程序的性能和可靠性。
本文将介绍Visual C++的一些常用内建函数,包括__assume、__cpuid、__debugbreak等。我们将会讨论它们的作用、使用方法以及一些注意事项。希望本文能对广大开发人员有所帮助。


  • __assume

__assume是VC++中的一个内置函数,它告诉编译器某个条件是不可能出现的,从而优化代码。在某些情况下,编译器无法确定一个条件是否成立,这时可以使用__assume函数来告诉编译器该条件不成立,从而让编译器优化掉相关代码。
使用方法如下:

__assume(条件);

  • __cpuid

__cpuid是VC++中的一个内置函数,用于获取CPU的信息。它将CPUID指令的返回值存储在指定的四个整数变量中。
使用方法如下:

void __cpuid(int *CPUInfo, int InfoType);
//其中CPUInfo是一个长度为4的整数数组,存储CPUID指令的返回值,InfoType是一个整数,指定要获取的CPU信息类型。

  • __debugbreak

__debugbreak是VC++中的一个内置函数,用于在调试时打断点。它会在代码中插入一个中断指令,当程序运行到该指令时会触发调试器中断程序的执行,从而方便调试。
使用方法如下:

__debugbreak();
//其中CPUInfo是一个长度为4的整数数组,存储CPUID指令的返回值,InfoType是一个整数,指定要获取的CPU信息类型。

  • 其他函数

除了以上三个内置函数外,VC++还提供了许多其他的内置函数,如__assume_aligned__builtin_prefetch__rdtsc等等,这些函数都有不同的作用和用法,可以根据需要调用。


  • 微软VC++编译器内建函数的官方文档地址

Alphabetical listing of intrinsic functions
该文档列出了所有内置函数,按照不同的类别进行分类,每个函数的用法、参数、返回值都有详细的说明,非常全面和详细。如果需要了解某个内置函数的具体用法,可以在该文档中查找相应的信息。


重载内建函数

譬如,要重载GCC内建函数,需要使用__builtin_前缀来指定内建函数的名称,并根据函数的签名提供正确的参数。要重载GCC内建函数,您需要使用__builtin_前缀来指定内建函数的名称,并根据函数的签名提供正确的参数。
例如,如果要重载GCC内建的memcpy函数,则可以这样定义自己的函数:

void* __builtin_memcpy(void* dest, const void* src, size_t n) {
    // your implementation here 
    }

请注意,重载内建函数需要非常小心,因为内建函数是由编译器实现的,通常对其进行优化以获得最佳性能。因此,如果您的实现不如编译器提供的实现效率高,则可能会导致性能下降。建议只在必要时才重载内建函数,并进行充分的测试和性能分析。
同时重定义时要指定参数set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-builtin"),否则会报错

结论

C/C++的内建函数是非常有用的工具,可以大大简化程序的编写和提高性能。标准库函数提供了大量常用的函数,可以方便地进行字符串处理、数学运算、文件操作等。编译器扩展函数则可以提供一些特定的功能或优化,例如__builtin_expect可以帮助优化分支预测,__builtin_popcount可以快速计算二进制数中1的个数。
当然,开发人员在使用内建函数时也需要注意一些事项,例如一些函数可能不是跨平台的,一些函数可能会有副作用等。因此,在使用内建函数时一定要仔细阅读相关文档,并根据实际情况进行选择和使用。
总之,熟练掌握C/C++的内建函数可以让开发人员更加高效地编写代码,提高程序的性能和可靠性。


目录
相关文章
|
1月前
|
程序员 C++ 容器
在 C++中,realloc 函数返回 NULL 时,需要手动释放原来的内存吗?
在 C++ 中,当 realloc 函数返回 NULL 时,表示内存重新分配失败,但原内存块仍然有效,因此需要手动释放原来的内存,以避免内存泄漏。
|
1月前
|
存储 前端开发 C++
C++ 多线程之带返回值的线程处理函数
这篇文章介绍了在C++中使用`async`函数、`packaged_task`和`promise`三种方法来创建带返回值的线程处理函数。
47 6
|
1月前
|
C++
C++ 多线程之线程管理函数
这篇文章介绍了C++中多线程编程的几个关键函数,包括获取线程ID的`get_id()`,延时函数`sleep_for()`,线程让步函数`yield()`,以及阻塞线程直到指定时间的`sleep_until()`。
25 0
C++ 多线程之线程管理函数
|
1月前
|
编译器 C语言 C++
C++入门3——类与对象2-2(类的6个默认成员函数)
C++入门3——类与对象2-2(类的6个默认成员函数)
27 3
|
1月前
|
编译器 C语言 C++
详解C/C++动态内存函数(malloc、free、calloc、realloc)
详解C/C++动态内存函数(malloc、free、calloc、realloc)
186 1
|
1月前
|
存储 编译器 C++
C++入门3——类与对象2-1(类的6个默认成员函数)
C++入门3——类与对象2-1(类的6个默认成员函数)
33 1
|
1月前
|
编译器 C语言 C++
C++入门6——模板(泛型编程、函数模板、类模板)
C++入门6——模板(泛型编程、函数模板、类模板)
44 0
C++入门6——模板(泛型编程、函数模板、类模板)
|
2月前
|
编译器 C++
【C++核心】函数的应用和提高详解
这篇文章详细讲解了C++函数的定义、调用、值传递、常见样式、声明、分文件编写以及函数提高的内容,包括函数默认参数、占位参数、重载等高级用法。
23 3
|
1月前
|
程序员 C++ 开发者
C++入门教程:掌握函数重载、引用与内联函数的概念
通过上述介绍和实例,我们可以看到,函数重载提供了多态性;引用提高了函数调用的效率和便捷性;内联函数则在保证代码清晰的同时,提高了程序的运行效率。掌握这些概念,对于初学者来说是非常重要的,它们是提升C++编程技能的基石。
21 0
|
3月前
|
编译器 C++ 容器
【C++】String常见函数用法
【C++】String常见函数用法