2016-05-03 8 views
5

all'interno di una definizione del genereindirizzo di una matrice dichiarata all'interno di una nuova struct

typedef struct 
{ 
    myType array[N]; 
} myStruct; 

myStruct obj; 

posso sempre supporre che ([modifica] assumendo una corretta fusione accadrà che non è al centro della questione qui [/ modifica ])

(&obj == &obj.array[0]) 

restituirà TRUE o dovrei preoccupare il compilatore introduzione di imbottitura extra per accogliere i requisiti di allineamento myType? In teoria ciò non dovrebbe accadere in quanto la struttura ha un singolo campo ma non ne sono completamente sicuro.

+7

C e C++ sono ** lingue diverse ** e un confronto produce tipi diversi in entrambi. Ma nessuno di loro ha una costante standard o una macro chiamata "VERO". – Olaf

+0

Mi raccomando di usare 'obj.array' se vuoi fare riferimento alla matrice e' obj.array [0] 'se vuoi fare riferimento al primo elemento dell'array. Usare 'obj' per accedere all'array sarà più difficile da capire per gli estranei. – jboockmann

+4

Non sono sicuro di C ma in C++ non può esserci padding prima della prima variabile membro. – NathanOliver

risposta

6

Con un cast corretto, questo restituirà sempre true.

Dalla sezione 6.7.2.1 del C standard:

13. Da un oggetto struttura, i membri non bit di campo e le unità in cui bit-campi risiedere avere indirizzi che aumentano in l'ordine in cui sono dichiarati. Un puntatore a un oggetto della struttura, opportunamente convertito, punta al suo membro iniziale (o se quel membro è un campo di bit, quindi all'unità in cui si trova ) e viceversa. All'interno di un oggetto struttura può esserci un pad senza nome, ma non all'inizio.

+0

Grazie per aver confermato lo standard C. E grazie anche agli altri ragazzi che hanno commentato (quelli che lo leggono con attenzione, almeno :-) – ad3angel1s

6

Secondo l'attuale C++ progetto di norma [class.mem] §20 (N4527), corsivo:

Se un oggetto classe standard layout ha un qualunque dato membro non statici, suo indirizzo è lo stesso come l'indirizzo della sua primo membro di dati non statici. In caso contrario, il suo indirizzo è uguale all'indirizzo della prima classe base subobject (se presente). [Nota: potrebbe pertanto esserci padding senza nome all'interno di una struttura di layout standard oggetto, ma non all'inizio, come necessario per ottenere l'allineamento appropriato. - nota end]

Sia myStruct è standard layout, dipende dal fatto che myType è di serie-layout. Se lo è, allora quello che chiedi è garantito dallo standard C++.

Nota che &obj e &obj.array[0] hanno tipi di puntatori non correlati, quindi l'espressione non è legale in C++.