itsnotmyrealname e rici toccano i driver hardware per questo, ma ho pensato che potrebbe aiutare a piedi attraverso il più semplice possibile scenario che porta a diverse dimensioni puntatore ...
Immaginate una CPU che può indirizzare parole di memoria a 32 bit e che il tipo C++ int
deve anch'esso avere una larghezza di 32 bit.
Questa CPU ipotetica indirizza parole specifiche utilizzando una numerazione: 0 per la prima parola (byte 0-3), 1 per il secondo (byte 4-7) e così via. int*{0}
è quindi la vostra prima parola in memoria (assumendo che non bizzarre nullptr
imbrogli richiedono altro), int*{1}
la seconda ecc ..
Cosa dovrebbe fare il compilatore fare per sostenere 8 bit char
tipi? Potrebbe essere necessario implementare il supporto char*
utilizzando un int*
per identificare la parola in memoria, ma occorre ancora due bit in più per memorizzare 0, 1, 2 o 3 per dire quale dei byte in quella parola viene puntato. Sarebbe effettivamente bisogno di generare codice macchina fino a un programma C++ potrebbe se si utilizza ...
struct __char_ptr
{
unsigned* p_;
unsigned byte_ : 2;
char get() const { return (*p_ & (0xFF << (8*byte_)) >> 8*byte_; }
void set(char c) { *p_ &= ~(0xFF << (8*byte_)); *p |= c << 8*byte_; }
};
Su un tale sistema - sizeof(__char_ptr) > sizeof(int*)
. La flessibilità dello standard C++ consente implementazioni C++ conformi per (e portabilità del codice da/a) sistemi bizzarri con questo o simili problemi.
fonte
2015-12-31 07:22:01
Cosa * non * capisci a riguardo? – EJP
@EJP: Non dovrebbero essere uguali? –
@Nan: Puoi spiegare cosa ti porta a pensare che sarebbero? Ciò aiuterebbe a chiarire qualsiasi idea errata ti stia conducendo a tale conclusione. – icktoofay