С++: глобальная переменная как указатель

Я новичок в С++ и у меня есть один вопрос к глобальным переменным. Я вижу во многих примерах, что глобальные переменные — это указатели с адресами кучи. Таким образом, указатели находятся в памяти для глобальных/статических переменных, а данные за адресами находятся в куче, верно?
Вместо этого вы можете объявить глобальные (без указателя) переменные, в которых хранятся данные. Таким образом, данные хранятся в памяти для глобальных/статических переменных, а не в куче.
Есть ли у этого решения недостатки по сравнению с первым решением с указателями и кучей?

Изменить:
Первое решение:

//global 
Sport *sport;
//somewhere
sport = new Sport;

Второе решение:

//global
Sport sport;

person Maxii    schedule 25.08.2013    source источник


Ответы (3)


Недостатком хранения ваших данных в глобальной/статической переменной является то, что размер фиксируется во время компиляции и не может быть изменен, в отличие от хранилища в куче, где размер может быть определен во время выполнения и многократно увеличиваться или уменьшаться в ходе выполнения. Время жизни также фиксируется как полное выполнение программы от начала до конца для глобальных/статических переменных, в отличие от хранилища в куче, где оно может быть получено и освобождено (даже неоднократно) на протяжении всего времени выполнения программы. С другой стороны, управление глобальным и статическим хранилищем выполняется за вас компилятором, тогда как хранилище кучи должно явно управляться вашим кодом. Таким образом, глобальное/статическое хранилище проще, но не так гибко, как хранилище кучи.

person Paul Evans    schedule 25.08.2013

Вы правы в своей гипотезе о том, где находятся объекты. Об использовании,
Это лошади для курсов. Определенного правила нет, все зависит от дизайна и типа функциональности, которую вы хотите реализовать. Например:
Можно выбрать версию указателя для достижения отложенной инициализации или полиморфное поведение , ни один из которых невозможен с глобальным подходом без указателя.

person Alok Save    schedule 25.08.2013

Верно. Объявленные переменные помещаются в DataSegment. И сидят там всю жизнь программы. Вы не можете освободить их. Вы не можете перераспределить их. В Windows DataSegment имеет фиксированный размер .... если вы поместите туда все, у вас может не хватить памяти (по крайней мере, так было раньше).

person Steve Wellens    schedule 25.08.2013