Структура объекта C++ в памяти по сравнению со структурой

46
задан Joel Spolsky 8 January 2009 в 05:47
поделиться

7 ответов

Стандарт C++ гарантии , что разметки памяти C struct и C++ class (или struct - то же самое) будут идентичны, при условии, что C++ class / struct соответствия критерии того, чтобы быть POD ("Простые Данные"). Таким образом, что означает POD?

класс А или структура являются POD если:

  • Все элементы данных общедоступны и они POD или фундаментальные типы (но не ссылка или указатель на типы элемента), или массивы такого
  • , Это не имеет никаких пользовательских конструкторов, операторов присваивания или деструкторов
  • , Это не имеет никаких виртуальных функций
  • , Это не имеет никаких базовых классов

О единственном "C ++-isms" позволенный, невиртуальные функции членства, статические участники и функции членства.

, Так как Ваш класс имеет и конструктора и деструктор, он официально говорит не типа POD, таким образом, гарантия не содержит. (Хотя, как другие упомянули, на практике эти две разметки, вероятно, будут идентичны на любом компиляторе, который Вы пробуете, пока нет никаких виртуальных функций).

раздел See [26.7] из FAQ C++, Облегченный для получения дополнительной информации.

63
ответ дан j_random_hacker 8 November 2019 в 00:13
поделиться

структура в память о example_struct подобном этому в Example_Class

, который поведение не гарантируется и зависимо от компилятора.

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

10
ответ дан ChrisW 8 November 2019 в 00:13
поделиться

Для добавления к тому, что сказали другие люди (например: определенный для компилятора, будет, вероятно, работать, пока у Вас нет виртуальных функций):

я высоко предложил бы, чтобы помехи утверждали (проверка времени компиляции), что sizeof (Example_class) == sizeof (example_struct) при выполнении этого. См. BOOST_STATIC_ASSERT или эквивалентную определенную для компилятора или пользовательскую конструкцию. Это - хорошая первая линия обороны, если кто-то (или что-то, такое как изменение компилятора) изменяет класс для лишения законной силы соответствия. Если Вы хотите дополнительную проверку, Вы можете также проверка на этапе выполнения, что смещения участникам являются тем же, которое (вместе со статическим размером утверждают) гарантирует правильность.

3
ответ дан Nick 8 November 2019 в 00:13
поделиться

Классы & структуры в C++ являются эквивалентом, за исключением того, что все члены структуры общедоступны по умолчанию (участники класса являются частными по умолчанию). Это гарантирует, что компиляция наследия C код в компиляторе C++ будет работать как ожидалось.

нет ничего мешающего Вам использовать все необычные функции C++ в структуре:

struct ReallyAClass
{
    ReallyAClass();
    virtual !ReallAClass();

    /// etc etc etc
};
0
ответ дан Mike Thompson 8 November 2019 в 00:13
поделиться

В случае Вы описываете, ответ - "вероятно, да". Однако, если класс имеет какие-либо виртуальные функции (включая виртуальный деструктор, который мог бы быть наследован от базового класса), или использует множественное наследование тогда, расположение класса может отличаться.

7
ответ дан Greg Hewgill 8 November 2019 в 00:13
поделиться

Почему не явно присваивают участников класса структуре, когда Вы хотите передать данные C? Тем путем Вы знаете, что Ваш код будет работать где угодно.

0
ответ дан Chuck 8 November 2019 в 00:13
поделиться

Вы, вероятно, просто получаете класс из структуры, или публично или конфиденциально. Тогда кастинг его решил бы правильно в коде C++.

-2
ответ дан Daemin 8 November 2019 в 00:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: