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

简介: C/C++ 函数的存储位置和占用空间

成员函数和this指针

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

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

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

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

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

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

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

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

不分函数类型

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

  1. 全局函数:全局函数不属于任何类,它们的地址在编译时就确定了,存储在代码段中。
  2. 静态成员函数:静态成员函数属于类,而不是类的对象。你可以在没有类的对象的情况下调用静态成员函数。静态成员函数的地址在编译时就确定了,存储在代码段中。静态成员函数没有this指针,因为它们不与特定的对象关联。
  3. 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函数对象的存储位置。

目录
相关文章
|
1月前
|
程序员 C++ 容器
在 C++中,realloc 函数返回 NULL 时,需要手动释放原来的内存吗?
在 C++ 中,当 realloc 函数返回 NULL 时,表示内存重新分配失败,但原内存块仍然有效,因此需要手动释放原来的内存,以避免内存泄漏。
|
1月前
|
存储 前端开发 C++
C++ 多线程之带返回值的线程处理函数
这篇文章介绍了在C++中使用`async`函数、`packaged_task`和`promise`三种方法来创建带返回值的线程处理函数。
48 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)
191 1
|
1月前
|
存储 编译器 C++
C++入门3——类与对象2-1(类的6个默认成员函数)
C++入门3——类与对象2-1(类的6个默认成员函数)
34 1
|
1月前
|
编译器 C语言 C++
C++入门6——模板(泛型编程、函数模板、类模板)
C++入门6——模板(泛型编程、函数模板、类模板)
46 0
C++入门6——模板(泛型编程、函数模板、类模板)
|
1天前
|
存储 编译器 C语言
【c++丨STL】string类的使用
本文介绍了C++中`string`类的基本概念及其主要接口。`string`类在C++标准库中扮演着重要角色,它提供了比C语言中字符串处理函数更丰富、安全和便捷的功能。文章详细讲解了`string`类的构造函数、赋值运算符、容量管理接口、元素访问及遍历方法、字符串修改操作、字符串运算接口、常量成员和非成员函数等内容。通过实例演示了如何使用这些接口进行字符串的创建、修改、查找和比较等操作,帮助读者更好地理解和掌握`string`类的应用。
14 2
|
8天前
|
存储 编译器 C++
【c++】类和对象(下)(取地址运算符重载、深究构造函数、类型转换、static修饰成员、友元、内部类、匿名对象)
本文介绍了C++中类和对象的高级特性,包括取地址运算符重载、构造函数的初始化列表、类型转换、static修饰成员、友元、内部类及匿名对象等内容。文章详细解释了每个概念的使用方法和注意事项,帮助读者深入了解C++面向对象编程的核心机制。
33 5
|
14天前
|
存储 编译器 C++
【c++】类和对象(中)(构造函数、析构函数、拷贝构造、赋值重载)
本文深入探讨了C++类的默认成员函数,包括构造函数、析构函数、拷贝构造函数和赋值重载。构造函数用于对象的初始化,析构函数用于对象销毁时的资源清理,拷贝构造函数用于对象的拷贝,赋值重载用于已存在对象的赋值。文章详细介绍了每个函数的特点、使用方法及注意事项,并提供了代码示例。这些默认成员函数确保了资源的正确管理和对象状态的维护。
46 4