Функция sizeof()
Внимание! Это довольно старый топик, посты в него не попадут в новые, и их никто не увидит. Пишите пост, если хотите просто дополнить топик, а чтобы задать новый вопрос — начните новый.
Внимание! Это довольно старый топик, посты в него не попадут в новые, и их никто не увидит. Пишите пост, если хотите просто дополнить топик, а чтобы задать новый вопрос — начните новый.
Пытаюсь вычислить, сколько места займёт мой объект в памяти компьютера. делаю так
но по неизвестным мне причинам выводится 16. Хотя насколько я знаю( я даже проверял той-же функцией sizeof() )
int
занимает в памяти 4 байта, аdouble
занимает 8 байт(в моей операционной системе). Что я не догоняю?Свойства объекта в памяти не обязательно должны идти впритык друг к другу. Сделайте дамп объекта, и посмотрите, чем заполняется выделенная для него память.
selevit, что то я не совсем понимаю, что показывает эта программа. Сначала мы передаём указатель на объект, а затем читаем область памяти, выделенную для этого объекта, так? Но тогда почему там даже мимоходом не упоминается число 10? А так же почему теперь объект занимает 4 байта в памяти( опять же sizeof() ) вместо 12 байт?
чего то сейчас дошло, раз свойства в разных местах памяти, то и функция sizeof() не подходит? или как?
selevit, программка-то с ошибкой. Ты в
dump()
передаёшь адрес указателя на объект и размер (sizeof) указателя на объект.Должно быть так:
Я ещё туда для проверки кусок с локальной переменной вставил и изменил инициализацию целого члена на -1, что бы были заполнены FF все байты, которые относятся к нему.
porshe, теперь результаты...
Вывод (Dev-C++ 5.5.3) получил такой (для разных компиляторов):
Размер объекта — 16 байт.
Первые 4 байта занимает
int i
. Членdouble s
занимает последние 8 байт. Он выровнен на границу 64-битного слова.Т.е. между переменными класса получилась неиспользуемая «дыра» в 4 байта.
Выравнивание по границе 64-разрядного слова делается компилятором для более быстрого обращения к этой области памяти.
А вот для такого класса:
с инициализацией члена ii значением 0xeeeeeeee, вывод будет таким:
А для такого:
вывод будет таким:
Чудеса? ;-)
Всем спасибо, за вашу помощь!