Помимо доступности, что еще влияет спецификатор доступа? - PullRequest
7 голосов
/ 12 февраля 2011

Помимо обычного объяснения того, что он является видимым или нет для производных классов, есть ли их другое отличие?

Если вы делаете это более заметным, занимает ли оно больше или меньше памяти, это замедляет процесс или ...?

Ответы [ 2 ]

6 голосов
/ 12 февраля 2011

Помимо доступности членов вне или для производных классов, спецификаторы доступа могут влиять на макет объекта.

Цитата из моего другого ответа :

Обычно адрес памяти для элементов данных увеличивается в том порядке, в котором они определены в классе. Но этот порядок может быть нарушен в любом месте, где встречаются спецификаторы доступа (private, protected, public) . Это подробно обсуждалось в Внутри объектной модели C ++ Липпман .

Выдержка из Журнала пользователей C / C ++ ,

Компилятору не разрешено делать это Сама перестановка, правда. Стандарт требует, чтобы все данные, которые это в такой же public :, protected: или личное: должно быть выложено в этом заказ по компилятору. Если вы разбросать ваши данные с доступом Спецификаторы, однако, компилятор разрешено переставлять блоки, определяемые спецификатором доступа данные для улучшения макета , , который почему некоторые люди любят ставить доступ спецификатор перед всеми данными член .

Интересно, не правда ли?

3 голосов
/ 12 февраля 2011

С n3225, 9,2 [class.mem] note 15

Нестатические члены данных (не объединяющего) класса с одинаковым контролем доступа (раздел 11) распределяются так, чтобы более поздние члены имели более высокие адреса внутри объекта класса. Порядок распределения нестатических элементов данных с различным контролем доступа не определен (11).

Это означает, что с учетом следующего объявления:

class Foo {
public:  int a;
private: int b;
public:  int c;
private: int d;
};

Стандартом применяются только следующие утверждения:

Foo foo;

assert(&foo.a < &foo.c);
assert(&foo.b < &foo.d);

@ Цитата Наваза может быть интерпретирована как предоставление 4 блоков, которые можно свободно смешивать, но это не так. Объявление Foo полностью эквивалентно:

class Foo' {
public:  int a,c;
private: int b,d;
};

Действительно, компилятор полностью игнорирует (для этой цели), появился ли спецификатор один или несколько раз, и указание его каждый раз является ложным и в лучшем случае замедляет компиляцию из-за дополнительного синтаксического анализа. Для человека-читателя это может быть яснее ... но это очень субъективно.

...