Ho letto C4267
di VC ++Compiler Warning (level 3) C4267
'var' : conversion from 'size_t' to 'type', possible loss of data
The compiler detected a conversion from size_t to a smaller type.
To fix this warning, use size_t instead of type. Alternatively, use an integral type that is at least as large as size_t.
Ho osservato questo aspetto e - forse non sorprendentemente - quando convertiamo una base di codice a 32 bit in 64 bit, là un lotti di questi errori, principalmente wrt. vector.size()
ecc.
Note:
-
/W3
è il livello predefinito in VC ++, quindi questo è un avviso predefinito. - L'avviso viene attivato solo per
size_t
- anche se è "solo" atypedef
perunsigned __int64
, se usi uint64 direttamente, l'avviso isn ' t attivato per quanto posso dire.
Ora, questo mi ha fatto meravigliare, puramente a livello concettuale, che questo avvertimento del compilatore abbia davvero senso per il 64% di size_t
= > Tipo a 32 bit?
size_t
, è un typedef utilizzato per le dimensioni. Principalmente std
raccolte ecc. Nel codice di livello inferiore per le dimensioni della memoria grezza.
Come tale, il troncamento di questi valori da 64 bit a 32 bit produrrà risultati errati IFF della dimensione in questione > 4G. Questo è molto, intendo davvero molto per i conteggi di dati del mondo reale.
Il troncamento a 16 bit o 8 bit merita certamente un avvertimento, ma questo non viene gestito separatamente qui. Come tale, ho l'impressione che questo avviso predefinito fornisca più rumore che valore per la maggior parte degli sviluppatori.
Questo avvertimento fornisce alcuni vantaggi reali che mi mancano qui? O è davvero semplicistico? Forse / forse mi manca un caso d'uso importante per size_t
?