Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 13, средняя оценка - 4.92
nikeo
0 / 0 / 0
Регистрация: 25.10.2012
Сообщений: 20
#1

Представление класса в памяти - C++

17.02.2013, 14:32. Просмотров 1831. Ответов 7
Метки нет (Все метки)

Всем доброго времени суток!

Подскажите ка,как класс представляется в памяти?и как представляется структура?

Простите за столь банальные вопросы.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.02.2013, 14:32     Представление класса в памяти
Посмотрите здесь:

Представление в памяти массивов и матриц C++
Представление полей одного класса через другой C++
C++ Представление в памяти компьютера типа double
C++ Представление в памяти массивов и матриц
Составить описание класса, обеспечивающего представление матрицы произвольного размера C++
Представление в памяти массивов и матриц C++
Объясните задачу про представление вещественных чисел в памяти компьютера C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Vourhey
Почетный модератор
6471 / 2246 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
17.02.2013, 14:36     Представление класса в памяти #2
Цитата Сообщение от nikeo Посмотреть сообщение
Подскажите ка,как класс представляется в памяти?
Имел ввиду объект класса? Потому что класса в памяти нет.
Просто данные-члены (и базовых классов тоже). Плюс указатель(и) на таблицу виртуальных функций. Структура - то же.
Nick Alte
Эксперт С++
1599 / 991 / 117
Регистрация: 27.09.2009
Сообщений: 1,911
Завершенные тесты: 1
17.02.2013, 15:05     Представление класса в памяти #3
В самом простом случае члены класса просто расположены в памяти друг за другом, с учётом выравнивания: при необходимости после очередного члена добавляется пустое место, чтобы адреса всех членов были кратны нужному числу (обычно 4), это делается для ускорения доступа к памяти. Выравниванием можно управлять при помощи директив компилятора (например, при работе с файлами или передаче данных по сети это бывает нужно). В классах с виртуальными функциями первым по порядку располагается указатель на таблицу виртуальных функций ("невидимый" для программиста). В более сложных случаях (например, множественное виртуальное наследование) в разных местах класса могут располагаться дополнительные служебные поля.
Vourhey
Почетный модератор
6471 / 2246 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
17.02.2013, 15:06     Представление класса в памяти #4
Цитата Сообщение от Nick Alte Посмотреть сообщение
В классах с виртуальными функциями перед членами вписывается указатель на таблицу виртуальных функций.
Это не оговаривается стандартом. Указатель может быть, как перед членами, так и после них. А может быть, в общем-то, где угодно. Это на усмотрение компилятора.
Nick Alte
Эксперт С++
1599 / 991 / 117
Регистрация: 27.09.2009
Сообщений: 1,911
Завершенные тесты: 1
17.02.2013, 15:11     Представление класса в памяти #5
В теории так, но знаем ли мы хоть один компилятор, который поступает иначе? Если располагать указатель не в начале объекта, то потом может оказаться трудно его разыскивать в потомках, добавляющих и свои собственные данные. В то время как при таком подходе объект очень легко "обрезать" до своего предка.
Vourhey
Почетный модератор
6471 / 2246 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
17.02.2013, 15:14     Представление класса в памяти #6
Цитата Сообщение от Nick Alte Посмотреть сообщение
В теории так, но знаем ли мы хоть один компилятор, который поступает иначе?
Это не имеет значения. Теоретически указатель может располагаться где угодно.
Цитата Сообщение от Nick Alte Посмотреть сообщение
Если располагать указатель не в начале объекта, то потом может оказаться трудно его разыскивать в потомках
Компилятор знает размер, занимаемый в памяти членами класса. Поэтому трудно не будет.
Цитата Сообщение от Nick Alte Посмотреть сообщение
В то время как при таком подходе объект очень легко "обрезать" до своего предка.
Легко, не легко, но говорить, что указатель располагается перед членами неправильно. Тема в разделе языка С++, а не конкретного компилятора. С теми, с которыми имел дело - да, перед членами. Но кто знает, сколько разных экзотических компиляторов и опций к ним еще существует. Он может располагаться где угодно в области памяти для членов. Главное, чтобы автор учел сам факт его наличия
Nick Alte
Эксперт С++
1599 / 991 / 117
Регистрация: 27.09.2009
Сообщений: 1,911
Завершенные тесты: 1
17.02.2013, 15:42     Представление класса в памяти #7
В таком случае некорректно вообще говорить об указателе и таблицах виртуальных методов, потому что компилятор вправе реализовывать динамический полиморфизм как ему угодно. Так что в экзотическом компиляторе с причудливыми опциями вполне может вообще не оказаться ни тех указателей, ни тех таблиц...
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.02.2013, 15:43     Представление класса в памяти
Еще ссылки по теме:

C++ Представление памяти, указатели
C++ Представление чисел в памяти!
C++ Внутреннее представление числа в памяти
C++ Представление и структура указателя в памяти
C++ Представление в памяти массивов и матриц

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Vourhey
Почетный модератор
6471 / 2246 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
17.02.2013, 15:43     Представление класса в памяти #8
Цитата Сообщение от Nick Alte Посмотреть сообщение
В таком случае некорректно вообще говорить об указателе и таблицах виртуальных методов, потому что компилятор вправе реализовывать динамический полиморфизм как ему угодно.
Да, теоретически вообще некорректно об этом говорить. Компилятор реализует, как угодно. Я лишь поправил предложение для случая, когда указатель в данных. А так, его там вообще может не быть. И такой ответ - самый правильный.
Цитата Сообщение от Nick Alte Посмотреть сообщение
Так что в экзотическом компиляторе с причудливыми опциями вполне может вообще не оказаться ни тех указателей, ни тех таблиц...
Все верно.
Yandex
Объявления
17.02.2013, 15:43     Представление класса в памяти
Ответ Создать тему
Опции темы

Текущее время: 08:54. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru