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

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

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

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

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

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

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

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

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