Рассмотрим эти два случая:Порядок хранения внутри структуры/объекта
struct customType
{
dataType1 var1;
dataType2 var2;
dataType3 var3;
} ;
customType instance1;
// Assume var1, var2 and var3 were initialized to some valid values.
customType * instance2 = &instance1;
dataType1 firstMemberInsideStruct = (dataType1)(*instance2);
class CustomType
{
public:
dataType1 member1;
dataType2 member2;
retrunType1 memberFunction1();
private:
dataType3 member3;
dataType4 member4;
retrunType2 memberFunction2();
};
customType object;
// Assume member1, member2, member3 and member4 were initialized to some valid values.
customType *pointerToAnObject = &object ;
dataType1 firstMemberInTheObject = (dataType1) (*pointerToAnObject);
Это всегда безопасно это сделать?
Я хочу знать, если стандарт определяет любой порядок хранения среди -
- элементов внутри структуры C.
- Элементы данных внутри объекта класса C++.
Определенно нет, если класс является полиморфным. Но я не уверен в технических деталях, когда это безопасно. – Mysticial
в C++ классы и структуры в основном одинаковы, кроме ключевого слова. Dataorder, как вы описали, но если вы хотите быть на 100% уверенным, вы можете использовать наследование, если вам просто нужно получить доступ к первому объекту. Кстати, почему бы вам не создать прямые указатели на элементы, тогда вы можете сделать что-то вроде '* (classInstancepointer-> memberpointer)' (примерно какое-то время) для доступа к данным, путем обмена указателем экземпляра вы можете получить доступ к данным в разные экземпляры. – ted
Я не думаю, что это вообще безопасно делать в C++: вы должны учитывать базовые (производные от) классы. Порядок переменных-членов гарантированно соответствует источнику. Это не очень отличается для C и C++: классы C++ могут иметь родительские классы и таблицу виртуальных методов, которых у C нет. Это делает результат «firstMemberInObject» несколько сложнее для чтения из источника. Кроме того, выравнивание полей может добавлять заполнение перед первым полем. – fork0