Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Работа с памятю в С++ 
:(
    Опции темы
grokk
Дата 23.6.2008, 19:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 13.5.2008

Репутация: нет
Всего: нет



Был недавно на интервью на должность QA. Там был задано несколько вопросов на которые я затруднился ответить
Если у вас есть неограниченая виртуальная память сколько максимум динамической памяти вы можете выделить с помощью new?
Также буду очень благодарен если кто-нибудь поможет найти информацию по принципу работы virtual table и вобще про работу с памятью в С++(где хранятся переменные,указатели ,сколько места занимает и тд)
Заранее спасибо за помощь

PM MAIL   Вверх
Partizan
Дата 23.6.2008, 19:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Let's do some .NET
****


Профиль
Группа: Модератор
Сообщений: 2828
Регистрация: 19.12.2005
Где: Санкт-Петербург

Репутация: 2
Всего: 67



про vtables обычно пишут в книжках про ком


--------------------
СУВ,
       Partizan.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
rrrFer
Дата 23.6.2008, 19:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 208
Регистрация: 11.5.2008
Где: Красноярск

Репутация: 0
Всего: 1



Цитата(grokk @  23.6.2008,  19:43 Найти цитируемый пост)
Если у вас есть неограниченая виртуальная память сколько максимум динамической памяти вы можете выделить с помощью new?

если память выделяется под одну переменную, то ровно столько, сколько есть оперативной памяти.
если выделяем под процесс, - то столько, сколько есть оперативной памяти+размер файла подкачки, потому что часть адресов выгружается в этот файл, но если переменная одна, то ясно что полпеременной выгрузить нельзя.
если виртуальная память неограничена, то все равно существуют ограничения операционной системы для памяти выделяемой под процесс. Мне не удавалось выделить более 2.4 Гб под свою программу, хотя файл подкачки позволял
PM MAIL WWW ICQ   Вверх
grokk
Дата 23.6.2008, 20:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 13.5.2008

Репутация: нет
Всего: нет



Цитата(Partizan @ 23.6.2008,  19:45)
про vtables обычно пишут в книжках про ком

а чтото в сети почитать кто-нибудь может посоветовать?
PM MAIL   Вверх
bsa
Дата 23.6.2008, 20:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Цитата(grokk @ 23.6.2008,  19:43)
Если у вас есть неограниченая виртуальная память сколько максимум динамической памяти вы можете выделить с помощью new?
Оператор new определен как:
Код
void *operator new(size_t size);
Отсюда следует, что памяти может быть выделено не более, чем число, которое помещается в переменную типа size_t (скорее всего, это будет не более NEW_ALLOC_MAX = 1<<(8*sizeof(size_t)) - 1).
Цитата(grokk @ 23.6.2008,  19:43)
Также буду очень благодарен если кто-нибудь поможет найти информацию по принципу работы virtual table и вобще про работу с памятью в С++(где хранятся переменные,указатели ,сколько места занимает и тд)

Принцип простой. У каждого класса, в котором есть виртуальные методы или который является наследником хоть одного класса с виртуальными методами, есть эта таблица. Она содержит указатели на виртуальные методы всех классов от текущего, до дальнего предка. Каждый новый виртуальный метод класса потомка увеличивает эту таблицу на 1 запись. Итак, когда выделяется память под класс, то размер таблицы виртуальных методов уже известен, затем следует вход в конструктор самого дальнего предка, он заполняет известную часть таблицы своими методами (это происходит до входа в тело конструктора, если он задан), затем тоже самое происходит поочередно со всеми классами в цепочке наследования, причем потомки могут менять уже существующие указатели на методы классов-предков на свои... Когда надо вызвать такой метод, то программа берет его адрес из таблицы... Деструкторы вызываются в обратном порядке. Перед входом в свое тело они делают тоже самое, что и перед входом в конструктор (тоже самое, а не обратное), что позволяет вызывать виртуальные методы из них не опасаясь вызвать метод потомка, деструктор которого уже отработал.
В случае с виртуальным наследованием я рассказывать не буду, так как сам немного плаваю в этом вопросе.
PM   Вверх
MAKCim
Дата 23.6.2008, 20:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 2
Всего: 207



Цитата(bsa @  23.6.2008,  20:33 Найти цитируемый пост)
Итак, когда выделяется память под класс

ты хотел сказать под объект класса?  smile 

Цитата(bsa @  23.6.2008,  20:33 Найти цитируемый пост)
он заполняет известную часть таблицы своими методами 

таблицу он не заполняет
таблица уже сформирована
изменяется адрес таблицы для объекта


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
bsa
Дата 23.6.2008, 21:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Цитата(MAKCim @ 23.6.2008,  20:59)
ты хотел сказать под объект класса?  smile 

таблицу он не заполняет
таблица уже сформирована
изменяется адрес таблицы для объекта

именно объект. это я так, думал уже о другом  smile 
А по поводу подмены таблицы - логично, и как я сам не догадался? smile
PM   Вверх
grokk
Дата 24.6.2008, 07:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 13.5.2008

Репутация: нет
Всего: нет



тоесть сама таблица содержится в классе и в ней сразу прописаны все вирутальные методы всех классов? и когда я создаю новый объект то он для каждого обьекта меняет адресс таблицы? 
то есть для нескольких обьектов будет несколько таблиц?

PM MAIL   Вверх
Lazin
Дата 24.6.2008, 08:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 27
Всего: 154



таблица - одна, для всех объектов одного класса, каждый экземпляр содержит указатель на таблицу виртуальных функций своего класса...
PM MAIL Skype GTalk   Вверх
bsa
Дата 24.6.2008, 10:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



grokk, точнее так, для каждого класса создается своя таблица на этапе компиляции. Каждый объект класса содержит указатель на данную таблицу. Перед входом в тело конструктора/деструктора значение этого указателя заменяется на адрес таблицы объекта класса, инициализируемого в данный момент.
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0524 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.