Maison  >  Article  >  développement back-end  >  Méthode d'allocation de mémoire pour les paramètres de pointeur de fonction C++

Méthode d'allocation de mémoire pour les paramètres de pointeur de fonction C++

WBOY
WBOYoriginal
2024-04-20 21:09:02983parcourir

Les paramètres de pointeur de fonction en C++ peuvent utiliser deux méthodes d'allocation de mémoire : l'allocation dynamique ou l'allocation statique. L'allocation dynamique utilise la mémoire tas et alloue et libère de la mémoire au moment de l'exécution ; l'allocation statique utilise la mémoire de pile et alloue de la mémoire au moment de la compilation.

C++ 函数指针参数的内存分配方式

Comment la mémoire est allouée pour les paramètres des pointeurs de fonction en C++

Les pointeurs de fonction sont un outil puissant en C++ qui nous permet de traiter les fonctions comme des citoyens de première classe. Cela signifie que nous pouvons transmettre des pointeurs de fonction vers d'autres fonctions, les stocker dans des structures de données ou même les créer dynamiquement.

Lorsque nous utilisons des pointeurs de fonction comme paramètres, nous devons prendre en compte la méthode d'allocation de mémoire. Il existe deux méthodes principales :

1. Allocation dynamique

Si nous ne sommes pas sûrs du type spécifique du pointeur de fonction ou si nous souhaitons modifier la valeur du pointeur de fonction au moment de l'exécution, nous pouvons utiliser l'allocation dynamique. L'allocation dynamique utilise la mémoire tas, par exemple :

// 创建一个指向函数的指针
int (*func_ptr)(int);

// 动态分配函数指针指向的内存
func_ptr = new int(*)(int)([](int x) { return x * x; });

// 调用函数指针
int result = func_ptr(5);

2. Allocation statique

L'allocation statique peut être utilisée si nous connaissons exactement le type du pointeur de fonction et n'avons pas l'intention de modifier sa valeur au moment de l'exécution. L'allocation statique utilise la mémoire de pile, par exemple :

// 创建一个指向函数的指针
int (*func_ptr)(int) = [](int x) { return x * x; };

// 调用函数指针
int result = func_ptr(5);

Cas pratique

Supposons que nous ayons une méthode nommée Shape 的类,该类有两个派生类:CircleSquare。每个派生类都有一个 calcArea pour calculer son aire. Nous pouvons calculer de manière générique l'aire de n'importe quelle forme en utilisant un argument de pointeur de fonction comme suit :

class Shape {
public:
    virtual double calcArea() = 0;
};

class Circle : public Shape {
public:
    double calcArea() override { return 3.14; }
};

class Square : public Shape {
public:
    double calcArea() override { return 4.0; }
};

// 函数指针参数表示计算形状面积的函数
double calcArea(Shape *shape, double (*func_ptr)(Shape*)) {
    return func_ptr(shape);
}

int main() {
    Circle circle;
    Square square;

    // 通过函数指针动态地计算面积
    double circleArea = calcArea(&circle, [](Shape *shape) { return static_cast<Circle*>(shape)->calcArea(); });
    double squareArea = calcArea(&square, [](Shape *shape) { return static_cast<Square*>(shape)->calcArea(); });
}

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn