Domanda

Sono consapevole che lanciare ints su float (e viceversa) è piuttosto costoso. Tuttavia, il compilatore lo fa automaticamente al momento della compilazione per le costanti nel codice? Ad es. c'è qualche differenza tra

float y = 123;
float x = 1 / y;

e

float y = 123.f;
float x = 1.f / y;

Vedo del codice che fa il secondo, ma non sono sicuro che si tratti di problemi di ottimizzazione o di sicurezza (vale a dire solo assicurarmi che il divario sia in virgola mobile anche se y sembra essere un int).

Sto usando gcc (poiché la risposta potrebbe essere specifica del compilatore.)

Inoltre, sarebbero apprezzati tutti i puntatori a un elenco di ciò che il compilatore può e non può ottimizzare in generale. Grazie!

È stato utile?

Soluzione

Sì, il compilatore eseguirà automaticamente la conversione. I tuoi due blocchi di codice sono identici.

Non è un'ottimizzazione. La disattivazione dell'ottimizzazione non comporterà che il compilatore includa la conversione int-float nel codice eseguibile, a meno che non sia un'implementazione molto di scarsa qualità.

Neanche per sicurezza. Il compilatore non fa mai nulla "solo nel caso in cui" un operando sembra essere di tipo diverso. Il compilatore conosce i tipi di tutto nel tuo codice. Se cambi il tipo di una variabile, tutto ciò che usa quella variabile viene ricompilato comunque; il compilatore non cerca di mantenere intatto tutto il resto e semplicemente aggiorna le sezioni modificate.

Altri suggerimenti

Sì, lo fa sicuramente, quindi i due frammenti sono equivalenti. L'unica cosa che conta è il tipo di variabile assegnata a.

I casi float y = 123 e float y = 123.f dovrebbero essere gli stessi per la maggior parte dei compilatori, ma float x = 1 / y e float x = 1.f / y genererà effettivamente risultati diversi se y è un numero intero.

Dipende davvero dal compilatore: alcuni potrebbero effettivamente memorizzare un int costante e convertirlo ogni volta che viene assegnato a una variabile float.

Ci sono casi in cui il compilatore lancia float su int, ad esempio

float f;
if (f > 1) ...

In questo caso ho avuto il caso (Visual Studio 2008) che il compilatore producesse un codice equivalente a

if (int (f) > 1) ...
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top