Как объекты хранятся в памяти в C++?

@Joy wang

Спасибо, это сработало. по-видимому, я не автоматизировал идентификацию на машинах. Я изменил сценарий arm, чтобы включить идентификацию, и взял идентификатор из выходных данных Get-AzureADserviceprincipal -searchstring "vmname"

9
задан sbi 14 November 2010 в 18:44
поделиться

5 ответов

Почти. Вы бросаете к Объекту* и забыли брать адрес. Давайте повторно спросим как следующее:

((int*)&myObject)[0] == i1

Необходимо быть действительно осторожными с предположениями как это. Поскольку Вы определили структуру, это должно быть верно в любом компиляторе, с которым Вы, вероятно, столкнетесь. Но все виды других свойств объекта (который Вы, возможно, опустили от своего примера), как другие сказали, сделают это не-POD, и мог (возможно зависимым от компилятора способом), делают вышеупомянутый оператор не верным.

Обратите внимание, что я не был бы так быстр, чтобы сказать Вам, что это будет работать, если Вы спросили о i3 - в этом случае, даже для плоскости, POD, выравнивание или порядок байтов могли легко завинтить Вас.

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

Ответ на Ваше редактирование: Если это - Ваше все определение класса, и Вы используете один из основных компиляторов с опциями по умолчанию и работаете на x86 процессоре, то да, Вы, вероятно, предположили правильное расположение памяти. Но выбор компилятора, параметров компилятора и другой архитектуры ЦП мог легко делать недействительным Ваши предположения.

16
ответ дан 4 December 2019 в 08:17
поделиться

Вот в чем разница, в котором этот прием только допустим для типов POD. Это - действительно все, которое существует к нему. Стандарт указывает, что этот бросок допустим для типа POD, но не делает гарантий о том, что происходит с типами не-POD.

3
ответ дан 4 December 2019 в 08:17
поделиться

Классы без виртуальных участников и без наследования размечаются в памяти точно так же, как структуры. Но, когда Вы начинаете добираться, уровни вещей наследования могут стать хитрыми, и может быть трудно выяснить, какие вещи порядка находятся в памяти (особенно множественное наследование).

Когда у Вас есть виртуальные участники, у них есть "vtable" в памяти, которая содержит указатели на фактическую функцию, которая создается на основе иерархии наследования класса.

Нижняя строка: не получайте доступ к классам этот путь вообще, если можно избежать его (и также сделать не memset их или memcpy их). Если необходимо сделать это (почему?) затем заботятся, который Вы знаете точно, как Ваши объекты класса будут в памяти и стараться избежать наследования.

5
ответ дан 4 December 2019 в 08:17
поделиться

Это действительно зависит от компилятора, или скорее это оставляют до компилятора определить расположение памяти.

Например, соединение общедоступных, частных, и защищенных членских переменных могло быть размечено таким образом, что каждый тип доступа непрерывен. Или, производным классам можно было чередовать членские переменные с неиспользуемым местом в суперклассе.

Вещи ухудшаются с виртуальным наследованием, где фактически наследованные базовые классы могут быть размечены где угодно в памяти, выделенной для того конкретного экземпляра.

POD отличается, потому что это должно быть совместимо с C.

2
ответ дан 4 December 2019 в 08:17
поделиться

Обычно то, что имеет значение, не, имеет ли класс конструктора: то, что имеет значение, - имеет ли класс какие-либо виртуальные методы. Для получения дополнительной информации, Google для 'vtable' и 'vptr'.

0
ответ дан 4 December 2019 в 08:17
поделиться
Другие вопросы по тегам:

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