[C++] Introduction détaillée aux connaissances de base (2)

Table des matières

1. Fonctions en ligne

1. Conception

2. Caractéristiques

3. Avantages et inconvénients des fonctions et macros en ligne

2. Le mot clé auto (C++11)

  1. Introduction à l'automobile

  2. Les règles d'utilisation de l'auto

    2.1 Auto est utilisé en combinaison avec des pointeurs et des références

    2.2 Définir plusieurs variables sur la même ligne

  3. Scénarios où auto ne peut pas être dérivé

    3.1 auto ne peut pas être utilisé comme paramètre de fonction

    3.2 auto ne peut pas être utilisé directement pour déclarer des tableaux

3. Boucle for basée sur la plage (C++11)

  1. La syntaxe de range pour

  2. Conditions d'utilisation du champ d'application

    2.1 La plage d'itérations de la boucle for doit être définie

Quatrièmement, la valeur nulle du pointeur nullptr (C++11)

  1. La valeur nulle du pointeur en C++98


1. Fonctions en ligne

1. Conception

Une fonction décorée avec inline est appelée une fonction inline . Lors de la compilation, le compilateur C++ la développera à l'endroit où la fonction inline est appelée . Il n'y a pas de surcharge liée à la création d'un cadre de pile pour les appels de fonction. Les fonctions inline améliorent l'efficacité du programme opération .

Si vous ajoutez le mot clé inline avant la fonction ci-dessus pour la transformer en fonction inline, le compilateur remplacera l'appel de la fonction par le corps de la fonction lors de la compilation. Vu par:

1. En mode release, vérifiez si l'appel Add existe dans le code assembleur généré par le compilateur ;

2. En mode débogage, le compilateur doit être défini, sinon il ne sera pas développé (car en mode débogage, le compilateur n'optimisera pas le code par défaut, la méthode de réglage de vs2013 est donnée ci-dessous)

2. Caractéristiques

  1. Inline est une méthode d' échange d'espace contre du temps . Si le compilateur traite la fonction comme une fonction en ligne, il remplacera l'appel de la fonction par le corps de la fonction pendant la phase de compilation . Défaut : cela peut agrandir le fichier objet. Avantage : moins d'appels frais généraux, améliorer l'efficacité du fonctionnement du programme.
  2. inline est juste une suggestion pour le compilateur. Différents compilateurs peuvent avoir différents mécanismes d'implémentation en ligne. La suggestion générale est : rendre la fonction plus petite (c'est-à-dire que la fonction n'est pas très longue, il n'y a pas d'instruction exacte, cela dépend de l'implémentation interne du compilateur), aucune fonction récursive et fréquemment appelée ne doit être décorée avec inline, sinon le compilateur ignorera la fonctionnalité inline.
  3. Inline ne recommande pas la séparation de la déclaration et de la définition, ce qui entraînera des erreurs de lien . Comme inline est développé, il n'y a pas d'adresse de fonction et le lien ne sera pas trouvé.

3. Avantages et inconvénients des fonctions et macros en ligne

  La différence entre les fonctions en ligne et les macros est que les macros sont remplacées par le préprocesseur, tandis que les fonctions en ligne sont implémentées via le contrôle du compilateur, les macros sont remplacées au stade du prétraitement et les fonctions en ligne sont développées au stade de la compilation. De plus, la fonction inline est une fonction réelle, mais lorsqu'elle est nécessaire, la fonction inline est développée comme une macro, de sorte que la poussée des paramètres de la fonction est annulée et la surcharge de l'appel est réduite. Ainsi, vous pouvez appeler des fonctions en ligne comme appeler des fonctions sans vous soucier de problèmes tels que les macros.

  En langage C, l'utilisation de macros (#define) pour écrire des fonctions peut être optimisée sans consommer de cadres de pile, ce qui convient pour appeler fréquemment de petites fonctions . Mais les macros sont quelque peu défectueuses. En C++, les fonctions inline, les constantes modifiées par const et les énumérations sont utilisées à la place des macros.

Comment remplacer les macros en C++ :

  1. La définition constante est remplacée par const et enum.
  2. Les définitions de fonctions courtes utilisent à la place des fonctions en ligne.

Avantages et inconvénients des fonctions en ligne ?

avantage:

  1. Étant donné que la fonction en ligne est une fonction, les paramètres de la fonction ont des types, de sorte que la détection du type de paramètre sera effectuée lors de l'étape de compilation, qui est plus sécurisée ;
  2. La fonction en ligne a été étendue à l'étape de compilation, ce qui réduit l'appel de fonction et améliore l'efficacité de fonctionnement de la fonction ;
  3. Les fonctions inline n'ont pas besoin d'ajouter des parenthèses partout comme les fonctions macro, ce qui facilite leur implémentation ;
  4. En mode débogage, il ne sera pas développé par défaut, vous pouvez déboguer ou vous pouvez vérifier s'il est développé en définissant le compilateur ;
  5. Il n'y aura pas d'effets secondaires.

défaut:

  1. Presque tous les endroits où une fonction en ligne est utilisée seront étendus, provoquant un gonflement du code.

Avantages et inconvénients des macros ?

(1) Avantages et inconvénients des constantes macro

avantage:

  1. Un changement et tous les changements pour réduire la probabilité d'erreurs et améliorer la lisibilité du code.

défaut:

  1. Le remplacement est effectué au nœud de prétraitement, aucune détection de type n'est effectuée et la sécurité du code est faible.

(2) Avantages et inconvénients des fonctions macro

avantage:

  1. Ce n'est pas une fonction, ce qui réduit la surcharge des appels de fonction et améliore l'efficacité de fonctionnement du programme ;
  2. Cela peut économiser certains codes, car la fonction macro peut encapsuler plusieurs instructions ;
  3. Peut améliorer la lisibilité du code.

défaut:

  1. L'étape de prétraitement de la fonction macro est remplacée, aucune détection de type n'est effectuée et la sécurité du code est faible ;
  2. Les fonctions de macro ne peuvent pas être déboguées (car elles sont remplacées dans l'étape de précompilation) ;
  3. Sujette aux erreurs, chaque partie de la fonction macro doit être entre parenthèses ;
  4. La position de chaque fonction macro sera développée, ce qui entraînera une expansion du code ;
  5. Les fonctions macro peuvent avoir des effets secondaires.

2. Le mot clé auto (C++11)

  1. Introduction à l'automobile

La signification de auto au début du C/C++ est la suivante : la variable modifiée avec auto est une variable locale avec mémoire automatique , mais malheureusement personne ne l'a utilisée. En C++11, le comité standard a donné à auto une toute nouvelle signification : auto n'est plus un indicateur de type de stockage, mais un nouvel indicateur de type pour instruire le compilateur, et la variable déclarée par auto doit être compilée par le compilateur dérivé de période de temps.

int TeTestAuto()
{
	return 10;
}
int main()
{
	int a = 10;
	auto b = a;//此时编译器会根据 a 的类型来对 b 的类型进行推导为 int
	auto c = 'a';
	auto d = TeTestAuto();
    auto e = &a;

	cout << typeid(b).name() << endl;
	cout << typeid(c).name() << endl;
	cout << typeid(d).name() << endl;
    cout << typeid(e).name() << endl;
    return 0;
}

 typeid(nom de variable).name() peut imprimer le type de variable.

Remarque : Lorsque vous utilisez auto pour définir une variable, celle-ci doit être initialisée. Au stade de la compilation, le compilateur doit déduire le type réel d'auto en fonction de l'expression d'initialisation. Par conséquent, auto n'est pas une déclaration de "type", mais un "espace réservé" lorsque le type est déclaré. Le compilateur remplacera auto par le type réel de la variable lors de la compilation.

  2. Les règles d'utilisation de l'auto

    2.1 Auto est utilisé en combinaison avec des pointeurs et des références

Lorsque vous utilisez auto pour déclarer un type pointeur, il n'y a pas de différence entre l'utilisation de auto et auto*, mais lorsque vous utilisez auto pour déclarer un type référence, vous devez ajouter & .

int x = 10;
auto a = &x;
auto* b = &x;
auto& c = x;

cout << typeid(a).name() << endl;
cout << typeid(b).name() << endl;
cout << typeid(c).name() << endl;

    2.2 Définir plusieurs variables sur la même ligne

Lors de la déclaration de plusieurs variables sur la même ligne, ces variables doivent être du même type , sinon le compilateur signalera une erreur, car le compilateur ne déduit en fait que le premier type, puis définit d'autres variables avec le type déduit.

void TestAuto()
{
    auto a = 1, b = 2; 
    auto c = 3, d = 4.0;  // 该行代码会编译失败,因为c和d的初始化表达式类型不同
}

  3. Scénarios où auto ne peut pas être dérivé

    3.1 auto ne peut pas être utilisé comme paramètre de fonction

// 此处代码编译失败,auto不能作为形参类型,因为编译器无法对a的实际类型进行推导
void TestAuto(auto a)
{}

    3.2 auto ne peut pas être utilisé directement pour déclarer des tableaux

void TestAuto()
{
    int a[] = {1,2,3};
    auto b[] = {4,5,6}; //编译会失败
}

  Il existe deux autres scénarios : (1). Afin d'éviter toute confusion avec auto en C++98, C++11 ne retient que l'utilisation d'auto comme indicateur de type ; (2) l'avantage le plus courant d'auto en pratique l'usage est de l'utiliser en conjonction avec la nouvelle boucle for fournie par C++11, qui sera mentionnée plus tard, ainsi que les expressions lambda.

3. Boucle for basée sur la plage (C++11)

  1. La syntaxe de range pour

Les parenthèses après la boucle for sont divisées en deux parties par les deux-points ":" : la première partie est la variable utilisée pour l'itération dans la plage, et la deuxième partie représente la plage à itérer. Dans ce cas, il n'est pas nécessaire de spécifier la plage de la boucle lors du parcours de toute la collection.

void Test()
{
    int arr[] = { 1, 2, 3, 4, 5 };
    for (auto& e : arr)//要改变数组的值,需要使用引用
        e *= 2;

    for (auto e : arr)
        cout << e << " ";
}

  2. Conditions d'utilisation du champ d'application

    2.1 La plage d'itérations de la boucle for doit être définie

Pour un tableau, il s'agit de la plage du premier élément et du dernier élément du tableau ; pour une classe, les méthodes de début et de fin doivent être fournies, et le début et la fin sont la plage des itérations de la boucle for.

void TestFor(int array[])
{
    for(auto& e : array)
        cout<< e <<endl;
}

 Remarque : il y a un problème avec le code ci-dessus, car la portée de for est incertaine.

Quatrièmement, la valeur nulle du pointeur nullptr (C++11)

  1. La valeur nulle du pointeur en C++98

NULL peut être défini comme la constante littérale 0, ou comme la constante d'un pointeur non typé (void*). Quel que soit le type de définition adopté, certains problèmes seront inévitablement rencontrés lors de l'utilisation de pointeurs de valeurs nulles.

void f(int)
{
	cout << "f(int)" << endl;
}
void f(int*)
{
	cout << "f(int*)" << endl;
}
//这里函数重载,但结果都是f(int)
//C++中,NULL被定义为0,这也不知道为什么是个错误不太好
int main()
{
	f(0);
	f(NULL);
	return 0;
}

   L'intention originale du programme est d'appeler la version pointeur de la fonction f(int*) via f(NULL), mais comme NULL est défini comme 0, c'est contraire à l'intention originale du programme.

   En C++98, la constante littérale 0 peut être soit un nombre entier, soit une constante pointeur non typée (void*), mais le compilateur la traite par défaut comme une constante entière. Si vous voulez la convertir selon Pour l'utiliser dans mode pointeur, il faut le forcer à (void *)0.

   Par conséquent, un correctif a été créé en C++ 11 pour remplacer NULL par nullptr.

Avis:

  1. Le fichier d'en-tête n'a pas besoin d'être inclus lors de l'utilisation de nullptr pour représenter la valeur null du pointeur, car nullptr a été introduit en tant que nouveau mot-clé dans C++11.
  2. En C++11, sizeof(nullptr) et sizeof((void*)0) occupent le même nombre d'octets.
  3. Afin d'améliorer la robustesse du code, il est recommandé d'utiliser nullptr lors de la représentation ultérieure de la valeur nulle du pointeur.


S'il y a des lacunes dans cet article, vous êtes invités à commenter ci-dessous, et je le corrigerai dès que possible.

 Vieux fers, pensez à liker et faites attention !!!   

Je suppose que tu aimes

Origine blog.csdn.net/m0_63198468/article/details/131218106
conseillé
Classement