Contesto: Ho deciso di riscrivere il mio script grafico 3D, evoluto in Python, in C per la velocità. Ciò implica l'apprendimento di C. La parte del programma in questione memorizza nella cache le informazioni normali su una mesh 3D.Evitare errori di allocazione (principianti) in questa sequenza di funzioni vettoriali in C
Qui ci sono 3 operazioni vettoriali chiamate in sequenza (piuttosto standard: sottrazione vettoriale per ottenere il vettore del bordo, prodotto incrociato e media), che vorrei essere il più veloce possibile, quindi sto cercando di evitare di archiviare nulla inutilmente sul mucchio ... e copiare le mie strutture troppe volte. Tuttavia, sono anche consapevole del fatto che se restituisco dei puntatori, indicherò lo spazio mem che non è più valido.
In questo modo proverei a scrivere tutte e tre le funzioni (in generale: struct copy in, struct copy out, piuttosto che puntatori).
typedef struct vector vector;
struct vector{
double x,y,z;
};
vector vect(vector a, vector b){
vector res;
res.x = b.x - a.x;
res.y = b.y - a.y;
res.z = b.z - a.z;
return res;
}
vector cross(vector a, vector b){
vector res;
res.x = a.y*b.z - a.z*b.y;
res.y = a.z*b.x - a.x*b.z;
res.z = a.x*b.y - a.y*b.x;
return res;
}
vector avg (vector a, vector b){
vector res;
res.x = (a.x + b.x)/2;
res.y = (a.y + b.y)/2;
res.z = (a.z + b.z)/2;
return res;
}
Ed ecco come si chiama:
m->Tpolynormals[i] = avg(cross(vect(*p->verts[0], *p->verts[1]),
vect(*p->verts[1], *p->verts[2])),
cross(vect(*p->verts[2], *p->verts[3]),
vect(*p->verts[3], *p->verts[0]))
);
È questo abbastanza efficiente o c'è un modo più veloce per farlo? So che posso sperimentare e "farlo funzionare", ma a questo punto mi piacerebbe assicurarmi che le basi siano solide. - Grazie
Modifica: aggiunta la mia definizione di struttura sopra, come qualcuno ovviamente ha sottolineato, duh. Le coordinate sono doppie (è ciò che emette il mio pacchetto 3D) e il sistema è a 64 bit.
Non temere i puntatori. Impara semplicemente a usarli correttamente. Per restituire un risultato è sufficiente aggiungere un parametro di destinazione alle funzioni che verranno popolate. Passare e restituire i puntatori è più efficiente del passare e restituire le strutture. –
Perché stai facendo una domanda sull'allocazione (memoria) e poi non pubblichi una singola riga che ha qualcosa a che fare con il presunto argomento? – EOF
@EOF Perché penso di sì. Passare e restituire le strutture da una funzione all'altra è l'utilizzo della memoria quando vengono create copie di esse. Passare puntatori è l'utilizzo della memoria perché devi tracciare dove sta puntando. Se hai un suggerimento per un titolo più accurato, scrivilo. – DailyFrankPeter