2016-04-16 3 views
0

Выход: 4
Я просто хочу спросить, что даже я не создал объект класса Test, почему он печатает 4?Занятия занимают память?

+4

В топливном баке вашего автомобиля есть 50 литров топлива, потому что '' volume (fuel_tank) '' возвращает 50? – BitTickler

+0

Я получил это благодарность. – shuboy2014

+0

Технически ОС пришлось загрузить исполняемый файл в память, поэтому класс может занять память! Ключевое слово здесь - «возможно», потому что все зависит от того, как ОС обрабатывает исполняемый файл и как компилятор компилирует класс и какова архитектура процессора. –

ответ

5

sizeof(X) - количество байтов, которое принимает X при создании. Вызов new имеет тенденцию использовать еще несколько байтов для служебных данных памяти, но массив с автоматическим хранением (on-stack или local или global или static и т. Д.) Размером X[N] займет на практике память N*sizeof(X) (немного, может быть, для функции local statics из-за требований безопасности потока).

Это не имеет никакого отношения к количеству памяти, которое сам тип принимает.

Классы сами используют память, если у них есть методы, которые не оптимизированы, если они имеют таблицу vtable (вызванную использованием ключевых слов virtual) или аналогичные. Тогда память, хранящая код или таблицы виртуальных функций, может существовать вне затрат на память экземпляров класса.

В самом языке C++ нет способа определить, сколько памяти занимает сам класс, а также нет надежного способа определить, что такое служебные данные new. Обычно вы можете решить эту проблему, просмотрев поведение во время выполнения или код для компилятора или библиотек времени исполнения для данной платформы.

+0

В общем, 'class' или' struct' является концепцией и не занимает пространство переменных (данных), но оно занимает память в памяти компилятора. Если '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' Переменная или экземпляр 'class' или' struct' занимает память. –

+0

@thom вы согласны или не согласны? Несколько систем различают код и память данных (некоторые системы записывают код в ПЗУ или тому подобное). Я предполагаю, что некоторые могут также кодировать vtables. Но большинство современных компьютеров, память - это память с большинством бит защиты/выполнения, установленными в таблице страниц. Я хочу сказать, что существует несколько способов, которыми класс может «занять память»; на практике это даже может быть priblem, потому что я могу написать код, который генерирует непристойное количество типов из очень короткой программы. – Yakk

+0

Не забудьте указать статические переменные-члены, которые занимают пространство памяти;) – YSC

Смежные вопросы