In C++, sto provando a scrivere un wrapper attorno a un intero di 64 bit. La mia aspettativa è che se scritto correttamente e tutti i metodi sono in linea, tale wrapper dovrebbe essere performante quanto il tipo reale. Rispondere a questo question su SO sembra essere d'accordo con le mie aspettative.Perché VC++ non è in grado di ottimizzare un wrapper intero?
Ho scritto questo codice per verificare la mia aspettativa:
class B
{
private:
uint64_t _v;
public:
inline B() {};
inline B(uint64_t v) : _v(v) {};
inline B& operator=(B rhs) { _v = rhs._v; return *this; };
inline B& operator+=(B rhs) { _v += rhs._v; return *this; };
inline operator uint64_t() const { return _v; };
};
int main(int argc, char* argv[])
{
typedef uint64_t;
//typedef B T;
const unsigned int x = 100000000;
Utils::CTimer timer;
timer.start();
T sum = 0;
for (unsigned int i = 0; i < 100; ++i)
{
for (uint64_t f = 0; f < x; ++f)
{
sum += f;
}
}
float time = timer.GetSeconds();
cout << sum << endl
<< time << " seconds" << endl;
return 0;
}
Quando eseguo questo con typedef B T
; invece di typedef uint64_t T
i tempi riportati sono costantemente più lenti del 10% quando compilati con VC++. Con g ++ le prestazioni sono le stesse se uso il wrapper o meno.
Dal momento che g ++ fa suppongo che non vi sia alcun motivo tecnico per cui VC++ non possa ottimizzarlo correttamente. C'è qualcosa che potrei fare per farlo ottimizzare?
Ho già provato a giocare con la bandiera ottimizzazioni senza successo
Hai eseguito il codice da Visual Studio o da una console Windows? – jpo38
Non sarò sorpreso se g ++ ha piegato l'intero ciclo. –
Tuffati nell'assemblaggio generato! –