2015-09-15 2 views
1

Насколько я знаю, данные класса и структура помещается одну переменную через другую, например:Класс и структура размещения данных C/C++

class Foo 
{ 
    int A; 
    char B; 
    float* C; 
    double* D; 
}; 

Foo Object; 
char* ptr = &Object; 

&(Object.A) == ptr; // all these are true 
&(Object.B) == ptr+sizeof(int); 
&(Object.C) == ptr+sizeof(int)+sizeof(char); 
&(Object.D) == ptr+sizeof(int)+sizeof(char)+sizeof(float*); 

ли он всегда работает таким образом? Будет ли он работать, если я сделаю все эти данные статичными в классе?

+2

указатель арифметики на 'void *' ?? hmm ... –

+5

«Всегда ли так работает?» ** Нет **. –

+0

Большое спасибо. Это то, что я хотел знать, если это какой-то стандарт, или если это иногда случается. – Avert

ответ

1

Ну, комментарии немного вводят в заблуждение, хотя все они верны. (Возможно, потому, что это фактически duplicate of an old question)

Ваше первоначальное предположение «в основном» правильно. Хорошо, в основном.

Единственное, что вы можете (по крайней мере, большую часть времени) полагаться на заказать элементов.

Фактический размер элементов сильно варьируется между платформами и компиляторами. Это проблема сама по себе, но int в большинстве случаев 32bit, но иногда 16 бит или даже 64 бит.

Кроме того, компиляторы могут (или не могут) добавлять некоторые дополнения между элементами, иногда в зависимости от типа элемента, иногда нет.

В заключении: если вы пишете код, который зависит от арифметики указателей, как один вы предложили, ваш код будет зависят от платформы и реализации/зависимый компилятор.

Смежные вопросы