Question pour les experts en #define - page 3

 
Alexandr Andreev:


Tout le monde semble comprendre.....

C'est donc pour ceux qui commencent leur chemin.....

Nous pouvons envelopper tout cela dans une classe stat et retourner une référence, qui ensuite égaliser le reste puisque cette méthode a un moins quand on travaille avec if (a!=5) Print(a) ; il ne fonctionnera pas, vous devriez toujours écrire if (a!=5) {Print(a);}, dans les classes nous pouvons corriger ce moment, mais je suis trop paresseux)) et en général, il semble que tout est dans les archives de l'histoire

comme avec les classes, initialiser nos données via une méthode statique et combiner l'appel de l'opérateur à notre print..... alorssi (a!=5) Print(a) ; , cela fonctionnera

Tout cela est dû à la paresse. Je me suis laissé emporter, mais j'ai abandonné. Réduire quelque chose, mais à un niveau raisonnable. En dehors des impressions, l'écriture dans un fichier permet soit de collecter des données, soit d'élaborer l'algorithme, soit de le définir. Et si vous marquez des lanières prédéterminées dans l'impression, les virgules s'imprimeront. Dans l'ensemble, cela entraîne le cerveau bien sûr, mais cela ne montre même pas le chemin.

 
Alexandr Andreev:



Dmitry Fedoseev:


Vladimir Simakov:


En l'occurrence, puis-je vous poser une question ? Quelle est la différence entre une définition et un appel de fonction pour le compilateur. J'en suis arrivé à la conclusion que ce n'est pas le cas. Est-ce que je me trompe ?

 
Valeriy Yastremskiy:

En l'occurrence, puis-je vous poser une question ? En quoi une définition diffère-t-elle d'un appel de fonction pour le compilateur ? J'en suis arrivé à la conclusion que ce n'est pas le cas. Est-ce que je me trompe ?

Define est une substitution pendant la compilation AVANT, afin que __LINE__ devienne exactement comme elle devrait être, vous pouvez substituer un fragment de code incomplet.

Et la fonction est une référence de code (goto) dans de nombreux langages et dans d'autres une substitution de code (dépliant toutes les fonctions) au moment de l'exécution.

Et defy est un peu mauvais parce qu'il rend plus difficile la recherche de bogues, donc un bon defy est quand il n'y a pas de defy...
 
Alexandr Andreev:

Define - substitution au moment de la compilation, afin que __LINE__ devienne exactement ce qu'elle doit être, vous pouvez substituer un extrait de code incomplet

Et la fonction est une référence de code (goto) dans de nombreux langages et dans d'autres une substitution de code (dépliant toutes les fonctions) au moment de l'exécution.

Question concernant MKL. Je comprends bien qu'il n'y a pas de goto dans l'exécutable, sauf pour les boucles. La question s'est posée en raison des particularités de la compilation. Strictement du haut vers le bas. Et si une variable est déclarée au bas du corps de la boucle, et appelée dans les conditions de la boucle, il y aura un avertissement. La sortie est vérifiée de haut en bas. Et l'exécutable est généré par la substitution de fonctions en tant que define, et non par des référencesgoto.

 
Alexandr Andreev:

Define - substitution au moment de la compilation, afin que __LINE__ devienne exactement ce qu'elle doit être, vous pouvez substituer un extrait de code incomplet

Dans de nombreux langages, une fonction est une référence au code (goto), tandis que dans d'autres, il s'agit d'une substitution de code (dépliant toutes les fonctions) au moment de la création de l'exécutable.

La substitution n'affecte donc que la vitesse de construction au moment de la compilation ?
Est-ce raisonnable uniquement pour la construction de grands projets?
Ou le code défectueux sera exécuté plus rapidement dans l'exécutable ?

 
Valeriy Yastremskiy:

La question porte sur le MKL. Je comprends bien qu'il n'y a pas de goto dans l'exécutable, sauf pour les boucles. La question s'est posée en raison des particularités de la compilation. Strictement du haut vers le bas. Et si une variable est déclarée en bas du corps de la boucle, et est appelée dans les conditions de la boucle, il y aura un avertissement. La sortie est vérifiée de haut en bas. Et l'exécutable est généré par la substitution de fonctions en tant que define, et non par des référencesgoto.

Non, mcl a bien utilisé la méthode du code de référence en 2008.

Il n'est pas évident que le déroulement complet soit utilisé aujourd'hui.

De nos jours, écrire son propre compilateur est un exercice de 3-4 ans dans n'importe quel département d'informatique,

Tout peut y être assez compliqué - il y a des références et du dépliage, donc on peut écrire son code comme on veut.

Le plus souvent, ils divulguent ce qu'ils peuvent, mais pas tout. Il est clair que les opérateurs comme for, etc. sont une autre histoire.

 
Roman:

La substitution n'affecte donc la vitesse de construction qu'au moment de la compilation ?
Est-ce raisonnable uniquement pour la construction de grands projets ?
Ou le code défectueux s'exécutera toujours plus rapidement dans l'exécutable ?

Le déploiement des fonctions habituelles est en soi

Par exemple, pour (int i=0 ; i<ArraiSize(max) ; i++)

ici ArraiSize(max) ; sera développé et donnera quelque chose comme l'adresse de la taille du tableau donné (si nous regardons le tableau, il a sa taille dans une variable, et ici nous obtenons la substitution pour cette variable "adresse en mémoire") c'est-à-dire qu'il n'y a aucun sens à le changer en une variable par lui-même, du tout

for (int i=0 ; i<ArraiSize(max) ; i++)

и

for (int i=0 ; i<size ; i++)

Dans ce cas, ArraiSize(max) et size ont les mêmes timings pour déterminer la valeur de la taille du tableau

 
Alexandr Andreev:

Non, μl a bien utilisé la méthode du code de référence en 2008.

Il n'est pas évident que le déroulement complet soit utilisé aujourd'hui.

De nos jours, écrire son propre compilateur est la 3e ou 4e année de tout département d'informatique,

Tout peut y être assez compliqué - il y a des références et du dépliage, donc on peut écrire son code comme on veut.

Le plus souvent, ils divulguent ce qu'ils peuvent, mais pas tout. Il est clair que les opérateurs comme for etc. sont une histoire totalement différente.

Merci. À en juger par le sujet en cours Erreurs et bugs, l'optimisation est tout..... enfin, une sorte de mal menant à la lumière)))) réparation éternelle si la voiture va aussi dans ce sens)

 
Roman:

La substitution n'affecte donc la vitesse de construction qu'au moment de la compilation ?
Est-ce raisonnable uniquement pour la construction de grands projets ?
Ou le code défectueux sera-t-il exécuté plus rapidement dans l'exécutable ?

1 - peut-être oui, mais en microsecondes =)

2 - très probablement au contraire - vous devez utiliser les définitions les plus courtes et le minimum.

3 - en 2008, cette affirmation serait vraie pour µl4. Mais maintenant la vitesse sera la même

 
Alexandr Andreev:

Le déploiement des fonctions normales va de soi.

Par exemple, pour (int i=0 ; i<ArraiSize(max) ; i++)

ici ArraiSize(max) ; sera développé et donnera quelque chose comme l'adresse de la taille du tableau donné (si nous regardons le tableau, il a sa taille dans une variable, et ici nous avons une substitution sur cette variable "adresse en mémoire") c'est-à-dire qu'il n'y a aucun sens à le changer en une variable, du tout

for (int i=0 ; i<ArraiSize(max) ; i++)

и

for (int i=0 ; i<size ; i++)

Dans ce cas, ArraiSize(max) et size ont les mêmes timings pour déterminer la valeur de la taille du tableau

Dans cet exemple de boucle, je pense que je ne suis pas d'accord sur les timings.
Au contraire, il est recommandé d'obtenir le résultat en taille variable, et de l'utiliser dans la condition.
La raison en est qu'à chaque itération pourArraiSize(max), la boucle se déroule inutilement, ce qui ralentit l'exécution de la boucle.
Ce sont des instructions inutiles dans le code assembleur.