Распределение памяти статических членов в классе - PullRequest
7 голосов
/ 19 марта 2011

Я недавно опубликовал вопрос: Инициализация членов статического класса.

Теперь, пожалуйста, проверьте этот код:

#include<iostream>
class A
{
    static int obj_s;
public: 
    A()
    {
        obj_s++;
        std::cout << A::obj_s << "\nObject(s) Created\n";
    }
};

int A::obj_s = 0;

int main()
{
}

Даже если не было создано ни одного объектакласса A, заставляя члена obj_s содержать значение 0 - не понадобится ли ему память с момента его определения?

Ответы [ 3 ]

7 голосов
/ 19 марта 2011

Очевидно, это занимает память. И int A::obj_s=0 это именно то, что он делает: он определяет переменную вместе с ее памятью. Фактически, когда мы говорим, что мы определили переменную X, это означает, что мы определяем память sizeof(X), и эту область памяти мы помечаем как X.


Подробнее о статических членах:

A::obj_s является статическим членом класса A. И статические члены существуют без какого-либо экземпляра. Они не являются частью экземпляров A.

§9.4.2 / 3 и 7 из стандарта,

после того, как статический элемент данных был определено, оно существует, даже если нет объектов его класса были созданы.

Статические члены данных инициализируются и уничтожен точно так же, как нелокальный объекты (3.6.2, 3.6.3).

Прочитайте мой полный ответ здесь:

Занимают ли статические члены класса память, если не создан объект этого класса?

0 голосов
/ 19 марта 2011

Так как класс никогда не создается, конструктор будет опущен на этапе компоновки, и, следовательно, вероятно, будет статический член, так как на него ссылается только конструктор.

Я не 100% уверен в приведенном выше утверждении.Моя самая большая неуверенность в том, составляет ли инициализация нуля ссылку.

РЕДАКТИРОВАТЬ : Поцарапайте это.Я только что проверил и обнаружил, что gcc испускает статический объект в конечный исполняемый файл, даже если он вообще не используется.

EDIT 2 : мне просто пришло в голову, что если классметоды и статический член определены в отдельном модуле компиляции, они фактически будут удалены из окончательного исполняемого файла.Они появляются только в тестовом примере, потому что компоновщик сокращает только на уровне единицы компиляции, а не отдельные символы.

РЕДАКТИРОВАТЬ 3 : Нет, поцарапайте даже это.Кажется, что gcc хочет связать все .o, даже те, на которые нет прямой или косвенной ссылки main().Вы узнаете что-то новое каждый день.

0 голосов
/ 19 марта 2011

Член obj_s является статическим, это означает, что он определен независимо от класса.

Строка:

int A::obj_s=0;

Не только определяет его значение, но и определяет используемую им память.
Вот почему в предыдущем вопросе вы получили ошибку компоновщика (для 'obj_s` не было выделено места. Теперь, когда вы добавили строку, компилятор определил ячейки памяти, используемые объектом иПрограмма теперь ссылки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...