Ho la seguente funzione:È una buona ragione per usare alloca?
double
neville (double xx, size_t n, const double *x, const double *y, double *work);
che esegue l'interpolazione di Lagrange a xx
base alle n
punti memorizzati nel x
e y
. L'array work
ha la dimensione 2 * n
. Dal momento che questo è l'interpolazione polinomiale, n
è nel campo da baseball di ~ 5, molto raramente più di 10.
Questa funzione è aggressivo ottimizzata, e dovrebbe essere chiamato in cicli stretti. La profilazione suggerisce che l'heap che alloca l'array di lavoro nel ciclo non è corretto. Sfortunatamente, dovrei comprimerlo in una classe simile alla funzione, e i client devono essere inconsapevoli della matrice di lavoro.
Per ora, utilizzare un argomento di template intero per il grado e std::array
evitare l'allocazione dinamica della matrice work
:
template <size_t n>
struct interpolator
{
double operator() (double xx) const
{
std::array<double, 2 * n> work;
size_t i = locate (xx); // not shown here, no performance impact
// due to clever tricks + nice calling patterns
return neville (xx, n, x + i, y + i, work.data());
}
const double *x, *y;
};
Sarebbe stato possibile memorizzare la matrice lavoro come membro mutevole della classe, ma si suppone che operator()
venga utilizzato contemporaneamente da più thread. Questa versione è OK se conosci n
in fase di compilazione.
Ora, ho bisogno del parametro n
da specificare in fase di esecuzione. Mi chiedo a qualcosa di simile:
double operator() (double xx) const
{
auto work = static_cast<double*> (alloca (n * sizeof (double)));
...
Alcuni campane suonano quando si utilizza alloca
: sto ovviamente intenzione di avere un tetto n
per evitare la chiamata alloca
traboccare (in ogni caso è abbastanza stupido da usare grado 100 interpolazione polinomiale).
Sono abbastanza scomodo con l'approccio però:
- Mi sto perdendo qualche pericolo evidente di
alloca
? - C'è un modo migliore per evitare l'allocazione dell'heap qui?
Non si può semplicemente scrivere questa funzione in C e utilizzare i VLA C99? –
@KonradRudolph 'double neville (double xx, size_t n, const double * x, const double * y, double * work);' - è necessario l'overloading dell'operatore per scrivere questa funzione? Wow, non l'ho mai saputo! –
@ H2CO3 Hehe, mi ha preso. Bene, il mio ultimo argomento è che non mi piace il collegamento tra codice C e C++. Ovviamente non c'è alcun problema reale (se fatto correttamente! E ho incontrato molte librerie C che hanno sbagliato e mi ha causato molto dolore). Ma poi, non vedo alcun vantaggio nell'usare VLA su 'alloca' ma forse mi manca qualcosa ...? –