domanda per gli esperti di #define - pagina 3

 
Alexandr Andreev:


Tutti sembrano capire.....

Quindi questo è per coloro che stanno appena iniziando il loro modo....

Possiamo avvolgere tutto in una classe stat e restituire un riferimento, che poi pareggia il resto poiché questo metodo ha un meno quando lavora con if (a!=5) Print(a); non funzionerà, dovreste sempre scrivere if (a!=5) {Print(a);}, nelle classi possiamo correggere questo momento, ma sono troppo pigro)) e in generale, sembra che tutto sia negli archivi della storia

il modo con le classi, inizializzare i nostri dati tramite metodo statico e combinare l'operatore chiamare il nostro print.... allorase (a!=5) Print(a); , funzionerà

Tutto questo è dovuto alla pigrizia. Mi sono lasciato trasportare, ma mi sono arreso. Ridotto qualcosa, ma in modo ragionevole. Oltre alle stampe, scrivere su file è raccogliere dati, o elaborare l'algoritmo, impostare. E se si segnano perizomi prestabiliti nella stampa, le virgole verranno stampate. Tutto sommato allena il cervello, certo, ma non mostra nemmeno il percorso.

 
Alexandr Andreev:



Dmitry Fedoseev:


Vladimir Simakov:


Posso farle una domanda? Qual è la differenza tra una definizione e una chiamata di funzione per il compilatore. Sono giunto alla conclusione che non lo è. Mi sbaglio?

 
Valeriy Yastremskiy:

Posso farle una domanda? Qual è la differenza tra una definizione e una chiamata di funzione per il compilatore. Sono giunto alla conclusione che non lo è. Mi sbaglio?

Define è una sostituzione durante la compilazione BEFORE, quindi __LINE__ diventa esattamente come dovrebbe essere, si può sostituire un frammento di codice incompleto.

E la funzione è riferimento al codice (goto) in molte lingue e in altre sostituzione del codice (svolgimento di tutte le funzioni) a runtime.

E il defy è una specie di male perché rende più difficile trovare i bug, quindi un buon defy è quando non c'è defy
 
Alexandr Andreev:

Definire - sostituzione a tempo di compilazione, così __LINE__ diventa esattamente come dovrebbe essere, si può sostituire il frammento di codice incompleto

E la funzione è riferimento al codice (goto) in molte lingue e in altre sostituzione del codice (svolgimento di tutte le funzioni) a runtime.

Domanda su MKL. Ho capito bene che non ci sono goto nell'eseguibile, tranne che per i loop. La questione nasce dalle peculiarità della compilazione. Rigorosamente dall'alto verso il basso. E se una variabile è dichiarata in fondo al corpo del ciclo, e chiamata nelle condizioni del ciclo ci sarà un avvertimento. L'uscita è controllata dall'alto verso il basso. E l'eseguibile è generato dalla sostituzione di funzioni come define, non da riferimentigoto.

 
Alexandr Andreev:

Definire - sostituzione a tempo di compilazione, così __LINE__ diventa esattamente come dovrebbe essere, si può sostituire il frammento di codice incompleto

Una funzione in molti linguaggi è un riferimento al codice (goto), mentre in altri il codice viene sostituito (svolgendo tutte le funzioni) a runtime.

Quindi la sostituzione influisce solo sulla velocità di compilazione?
È ragionevole solo per costruire grandi progetti?
O il codice defunto sarà eseguito più velocemente nell'eseguibile?

 
Valeriy Yastremskiy:

La domanda è in relazione a MKL. Ho capito bene che non ci sono goto nell'eseguibile, tranne che per i loop. La questione nasce dalle peculiarità della compilazione. Rigorosamente dall'alto verso il basso. E se una variabile è dichiarata in fondo al corpo del ciclo, e viene chiamata nelle condizioni del ciclo, ci sarà un avvertimento. L'uscita è controllata dall'alto verso il basso. E l'eseguibile è generato dalla sostituzione di funzioni come define, non da riferimentigoto.

No, mcl ha sicuramente usato il metodo di riferimento del codice nel 2008.

Se lo srotolamento completo sia usato ora non è ovvio.

Al giorno d'oggi scrivere il proprio compilatore è il 3-4 anno in qualsiasi dipartimento di informatica,

Tutto può essere piuttosto complicato lì - ci sono riferimenti e de-folding, quindi uno può scrivere il suo codice come vuole.

Molto probabilmente, rivelano quello che possono, ma non tutto. È chiaro che operatori come for, ecc. sono una storia completamente diversa.

 
Roman:

Quindi la sostituzione influisce solo sulla velocità di compilazione al momento della compilazione?
È ragionevole solo per costruire grandi progetti?
O il codice defunto verrà comunque eseguito più velocemente nell'eseguibile?

Il dispiegamento di funzioni usuali è di per sé

cioè per esempio per (int i=0; i<ArraiSize(max); i++)

qui ArraiSize(max); sarà espanso e otterrà qualcosa come l'indirizzo alla dimensione dell'array dato (se guardiamo l'array, ha la sua dimensione in una variabile, e qui otteniamo la sostituzione di questa variabile "indirizzo in memoria") cioè non ha senso cambiarla in una variabile da sola, affatto

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

и

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

In questo caso ArraiSize(max) e size hanno gli stessi tempi per determinare il valore della dimensione dell'array

 
Alexandr Andreev:

No, μl ha sicuramente usato il metodo di riferimento del codice nel 2008.

Se lo srotolamento completo sia usato ora non è ovvio.

Al giorno d'oggi, scrivere il proprio compilatore è il 3°-4° anno di qualsiasi dipartimento di informatica,

Tutto può essere piuttosto complicato lì - ci sono riferimenti e de-folding, quindi uno può scrivere il suo codice come vuole.

Molto probabilmente, rivelano quello che possono, ma non tutto. È chiaro che operatori come for ecc. sono una storia completamente diversa.

Grazie. A giudicare dall'argomento in corso Errori e bug, l'ottimizzazione è tutto.... beh, una specie di male che porta alla luce)))) riparazione eterna se anche l'auto va in questa direzione)

 
Roman:

Quindi la sostituzione influisce solo sulla velocità di compilazione al momento della compilazione?
È ragionevole solo per costruire grandi progetti?
O il codice defunto sarà eseguito più velocemente nell'eseguibile?

1 - forse sì, ma in microsecondi =)

2 - molto probabilmente al contrario - è necessario utilizzare le definizioni più brevi e il minimo.

3 - nel 2008 questa affermazione sarebbe vera per µl4. Ma ora la velocità sarà la stessa

 
Alexandr Andreev:

Il dispiegamento di funzioni normali è una cosa ovvia

cioè per esempio per (int i=0; i<ArraiSize(max); i++)

qui ArraiSize(max); sarà espanso e otterrà qualcosa come l'indirizzo alla dimensione dell'array dato (se guardiamo l'array, ha la sua dimensione in una variabile, e qui abbiamo la sostituzione su questa variabile "indirizzo in memoria") cioè non ha senso cambiarla in una variabile, affatto

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

и

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

In questo caso ArraiSize(max) e size hanno gli stessi tempi per determinare il valore della dimensione dell'array

Non sono d'accordo con i tempi in questo loop di esempio.
Al contrario, si raccomanda di ottenere il risultato nella variabile di dimensione, e di usarlo nella condizione.
La ragione è che ad ogni iterazione perArraiSize(max), il ciclo si snoda inutilmente, rallentando l'esecuzione del ciclo.
Si tratta di istruzioni non necessarie nel codice assembler.