C/C++ 函数的存储位置和占用空间详解

 更新时间:2023年06月08日 11:37:16   作者:泡沫o0  
Lambda函数的代码部分在代码段中,被捕获的变量存储在Lambda函数对象的内部,这些变量的存储位置取决于Lambda函数对象的存储位置,这篇文章主要介绍了C/C++函数的存储位置和占用空间,需要的朋友可以参考下

成员函数和this指针

C++类的成员函数并不以函数指针的形式存储在类的结构中。类的成员函数在编译时就已经确定了地址,它们不占用类实例的存储空间。这意味着,无论你创建多少个类的对象,成员函数只有一份拷贝。

当你调用一个对象的成员函数时,编译器知道去哪里找到这个函数的代码,并且知道如何传递特殊的隐藏参数this,这个参数是一个指向调用对象的指针,用于访问对象的数据成员。

然而,你可以在类中定义成员函数指针,并且这个指针会占用类实例的存储空间。这个指针的大小通常是4字节(在32位系统上)或8字节(在64位系统上),但这取决于具体的实现。

总的来说,成员函数本身并不存储在类的实例中,但是成员函数指针可以作为类的成员变量,占用类实例的存储空间。

成员函数并不占用对象的内存空间

成员函数并不占用对象的内存空间。无论你在类中声明多少个成员函数,每个对象的大小都不会因此改变。这是因为成员函数在编译时就已经确定了地址,它们存储在代码段,而不是每个对象的内存空间中。

this指针是一个隐含的参数,当你调用一个对象的成员函数时,编译器会自动将对象的地址作为this指针传递给成员函数。this指针用于访问调用对象的数据成员和其他成员函数。

但是需要注意的是,this指针并不存储成员函数的地址。它只是一个指向当前对象的指针,用于在成员函数内部访问对象的数据成员和其他成员函数。成员函数的地址是在编译时确定的,存储在代码段中。

不分函数类型

无论是全局函数、静态成员函数,还是const成员函数,它们的行为在这方面都是类似的。这些函数的代码在编译时就已经确定了位置,存储在代码段中,而不是存储在每个对象的内存空间中。下面是一些额外的细节:

  • 全局函数:全局函数不属于任何类,它们的地址在编译时就确定了,存储在代码段中。
  • 静态成员函数:静态成员函数属于类,而不是类的对象。你可以在没有类的对象的情况下调用静态成员函数。静态成员函数的地址在编译时就确定了,存储在代码段中。静态成员函数没有this指针,因为它们不与特定的对象关联。
  • const成员函数:const成员函数是一种特殊类型的成员函数,它们不能修改对象的数据成员(除非这些成员被声明为mutable)。const成员函数的地址在编译时就确定了,存储在代码段中。在const成员函数中,this指针是一个指向const的指针,这意味着你不能通过this指针来修改对象的数据成员。

总的来说,函数(无论是全局函数、静态成员函数,还是const成员函数)的代码都存储在代码段中,而不是对象的内存空间中。

Lambda函数

Lambda函数在C++中是一个特殊的对象类型,被称为闭包类型。每个Lambda表达式都会生成一个唯一的闭包类型。Lambda函数的代码部分(即{}中的部分)在编译时确定,存储在代码段中,这与其他函数相同。

然而,Lambda函数可能会捕获其周围的变量,这些被捕获的变量被存储在Lambda函数对象的内部。这些变量的存储位置取决于Lambda函数对象的存储位置。如果Lambda函数对象在栈上创建,那么这些捕获的变量也在栈上。如果Lambda函数对象在堆上创建(例如,通过使用new关键字),那么这些捕获的变量也在堆上。

例如:

int x = 10;
auto lambda = [x]() { return x + 1; };

在这个例子中,lambda是一个Lambda函数对象,它捕获了变量xx的值被存储在lambda对象内部,而lambda对象本身在栈上创建。

总的来说,Lambda函数的代码部分在代码段中,被捕获的变量存储在Lambda函数对象的内部,这些变量的存储位置取决于Lambda函数对象的存储位置。

到此这篇关于C/C++ 函数的存储位置和占用空间的文章就介绍到这了,更多相关C++ 函数的存储位置内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:

相关文章

  • C语言深入探索递归的特点

    C语言深入探索递归的特点

    程序调⽤⾃⾝的编程技巧称为递归 recursion)函数⾃⼰调⽤⾃⼰就是递归,你也可以理解成是⼀种嵌套结构,但递归分为俩部分,第⼀是“递”,进⼊嵌套结构。第⼆是”归“,最终会⼀步⼀步返回。第⼀次接触递归都会很懵,慢慢理解这个过程就明⽩了
    2022-06-06
  • Qt实现屏幕底部冒泡效果

    Qt实现屏幕底部冒泡效果

    这篇文章主要为大家详细介绍了Qt实现屏幕底部冒泡效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-08-08
  • C语言结构体详细图解分析

    C语言结构体详细图解分析

    C 数组允许定义可存储相同类型数据项的变量,结构是 C 编程中另一种用户自定义的可用的数据类型,它允许你存储不同类型的数据项,本篇让我们来了解C 的结构体
    2022-03-03
  • 使用OpenGL实现3D立体显示的程序代码

    使用OpenGL实现3D立体显示的程序代码

    本篇文章是对使用OpenGL实现3D立体显示的方法进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • 让应用程序只运行一个实例的实现方法

    让应用程序只运行一个实例的实现方法

    我们在使用《360软件管家》时发现,在《360软件管家》已经运行了的情况下,再次点击《360软件管家》的图标,那么它不会再运行另外一个《360软件管家》,而是将已有的《360软件管家》给激活,始终只能运行一个《360软件管家》的实例
    2013-05-05
  • C++中fstream,ifstream及ofstream用法浅析

    C++中fstream,ifstream及ofstream用法浅析

    这篇文章主要介绍了C++中fstream,ifstream及ofstream用法,适合C++初学者学习文件流的操作,需要的朋友可以参考下
    2014-08-08
  • C++之默认参数详解

    C++之默认参数详解

    这篇文章主要介绍了C++的默认参数,是C++入门学习中的基础知识,需要的朋友可以参考下,希望能够给你带来帮助
    2021-11-11
  • C++实现LeetCode(36.验证数独)

    C++实现LeetCode(36.验证数独)

    这篇文章主要介绍了C++实现LeetCode(36.验证数独),本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-07-07
  • 一文详解C语言中的switch语句和while循环

    一文详解C语言中的switch语句和while循环

    这篇文章主要给大家详细介绍了C语言中的switch语句和while循环,文中通过代码示例给大家介绍的非常详细,对大家的学习或工作有一定的帮助,需要的朋友可以参考下
    2023-12-12
  • c/c++单例模式类的混合编译案例详解

    c/c++单例模式类的混合编译案例详解

    ​ 由于c语言中没有类的概念,因此对于有类的cpp文件与c文件混合编译时,提供一个中间层提供类的操作接口,在c文件中调用接口实现间接操作类对象,这篇文章主要介绍了c/c++单例模式类的混合编译的相关资料
    2022-10-10

最新评论