2013-02-10 2 views
0

Если мы имеем следующий код:Безопасность указателя arithmatic на унаследованных объектов

struct Base 
{ 
    int x; 
    int y; 
    void foo(); 
    virtual unsigned getCrc() = 0; 
}; 

struct Derived1 : public Base 
{ 
    int a; 
    int b; 
    unsigned getCrc(); 
}; 

struct Derived2 : public Base 
{ 
    float a; 
    float b; 
    unsigned getCrc(); 
}; 

Является ли это C++ стандарт, который a и b должны быть после x и y в памяти? Или это самый используемый метод для наследования унаследованных возражений? (т. е. дефакто-стандарт компилятора).

Другими словами, я могу гарантировать, что:

Derived1 obj; 

    int* unsafe_internal_a = (int*)((unsigned)(&obj) + sizeof(Base)); 

EDIT: Мой вопрос «покрыта ли распределение памяти в некоторых стандартных? Или это зависит от компилятора? '. Код просто для иллюстрации.

+0

AFAIK, 'a' и' b' всегда будут после 'x' и' y', но могут быть добавлены байты добавления, куда выбирает компилятор. –

+0

Порядок членов в структуре или классе сохраняется, но между ними может быть добавлено дополнение. – 2013-02-10 15:00:01

+1

Вы получаете правильное значение _a_? Разве _Derived1_ должен также иметь указатель на vtable? – Zlatomir

ответ

0

Это будет безопаснее

size_t off = offsetof(Derived1, a); 
Derived1 obj; 

unsigned* unsafe_internal_a = (unsigned*)((char *)(&obj) + off); 
+2

Нет, [offsetof будет работать только для объектов POD] (http://stackoverflow.com/questions/1129894/why-cant-you-use-offsetof-on-non-pod-strucutures-in-c) –

1

Ответ на ваш вопрос: они зависят компилятор в определенных ситуациях, а не в других. Details within

Если вам нужно извлечь данные из класса и свести его к минимальному формату, я предлагаю реализовать для них набор serialize/deserialize methods. Если вы просто пытаетесь выяснить, что делает C++, связанный с этим вопрос должен многое помочь.

+0

Схема памяти статья рассказывает о Microsoft Visual C++. MSVC - самый дальний компилятор из стандартов. – Yousf

+0

@ Yousf, я согласен с тем, что MSVC не может быть самым совместимым компилятором, но связанный с ним ответ имеет больше, чем просто объяснение MSVC. –