Читал Страуструпа, не нашел описания как выглядит объект в памяти, там написано немного лишь про о объект с виртуальными функциями? Где почерпнуть знания?
Здравствуйте, na1s, Вы писали:
N>Читал Страуструпа, не нашел описания как выглядит объект в памяти, там написано немного лишь про о объект с виртуальными функциями? Где почерпнуть знания?
Это зависит от компилятора. Большенство компиляторов располагают по смещению 0 указатель на табилцу виртуальных функций, а далее следуют поля класса. При наследовании поля и табилца виртуальных функций дополняются полями и виртуальными функциями потомка. Это делает восходящее приведение типов безопсным.
Здравствуйте, na1s, Вы писали:
N>Читал Страуструпа, не нашел описания как выглядит объект в памяти, там написано немного лишь про о объект с виртуальными функциями? Где почерпнуть знания?
А вообще-то надо на примере конкретного компилятора смотреть, конечно.
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Вот если есть объект, просто без наследования, как он выгядит в памяти? Например объект — два числа и функция вывода, функция находится рядом с этими числами или как?
... << RSDN@Home 1.2.0 alpha rev. 685>>
Re[2]: Как выглядит объект в памяти?
От:
Аноним
Дата:
15.09.07 19:52
Оценка:
Здравствуйте, na1s, Вы писали:
N>Вот если есть объект, просто без наследования, как он выгядит в памяти? Например объект — два числа и функция вывода, функция находится рядом с этими числами или как?
Нет, функция будет находиться отдельно.
Например, если есть такой класс
class X
{
int a;
int b;
public:
void print();
};
И ты создашь объект на стеке или в куче:
...
{
X obj; // создали объект класса X на стеке
X* pobj = new X(); // выделили память в куче
}
то будет выделено sizeof(a)+sizeof(b) байт и переменные a и b будут лежать в памяти примерно так:
+-------+-------+
| int a | int b |
+-------+-------+
Код функции print будет размещен где-то в другом месте. Одна и та же функция будет использоваться для всех объектов класса X. Чтобы функция print знала данные-члены какого именно объекта выводить, ей неявно, первым параметром, передается указатель на объект для которого она вызывается.
Здравствуйте, Аноним, Вы писали:
А>то будет выделено sizeof(a)+sizeof(b) байт и переменные a и b будут лежать в памяти примерно так: А>| int a | int b |
Стандартом это как-нибудь регламентировано? Или implementation-defined?
Здравствуйте, JohnCapfull, Вы писали:
JC>Стандартом это как-нибудь регламентировано? Или implementation-defined?
В целом что-то регламентированно для POD. Остальное -- как получится, но реализации отличаются не глобально в целом.
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском