Помимо доступности, на что еще влияют спецификаторы доступа?

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

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


person Community    schedule 12.02.2011    source источник


Ответы (2)


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

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

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

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

Однако компилятору не разрешено выполнять эту перестановку самостоятельно. Стандарт требует, чтобы все данные, находящиеся в одном общедоступном:, защищенном: или частном:, были размещены компилятором в указанном порядке. Однако, если вы перемежаете свои данные спецификаторами доступа, компилятору разрешается переупорядочивать блоки данных, разделенные спецификаторами доступа, для улучшения макета, вот почему некоторым людям нравится помещать доступ перед каждым элементом данных.

Интересно, не так ли?

person Nawaz    schedule 12.02.2011
comment
@Nawaz: Да, интересно. Таким образом, если вам нужен высокооптимизированный код, вам лучше использовать индивидуальные спецификаторы доступа? - person ; 12.02.2011
comment
@Nawaz: И спасибо, в прошлый раз это слишком быстро и слишком много. В любом случае я благодарен всем, кто помог кому бы то ни было. Я должен быть новичком в stackoverflow. - person ; 12.02.2011
comment
@RealmSeeker: Да. Эта статья предполагает, что. :-) - person Nawaz; 12.02.2011
comment
@Nawaz: это немного неправильно. Я отвечу более подробно, потому что комментарии не очень подходят для такого объяснения. - person Matthieu M.; 12.02.2011
comment
@Nawaz: вот, пожалуйста, я раскопал цитату из последней версии C++0X FCD. Обратите внимание на отсутствие понятия блока, не имеет значения, повторяете ли вы спецификатор доступа перед каждым членом или чередуете общедоступные/частные блоки в своем объявлении. - person Matthieu M.; 12.02.2011
comment
@Matthieu: это C++0x, а не C++03. Но спасибо, что упомянули об этом. :-) - person Nawaz; 12.02.2011
comment
@Nawaz: К сожалению, у меня нет стандарта С++ 03, и я не собираюсь платить за него сейчас :) Я сомневаюсь, что он изменился в последнее время, я скорее думаю, что цитата непродуманна и не совсем передать то, что имел в виду автор. - person Matthieu M.; 12.02.2011
comment
@Matthieu: Что вы подразумеваете под непродуманным? - person Nawaz; 12.02.2011
comment
@Nawaz: я имею в виду, что это может не выражать то, что на самом деле хотел сказать автор (с другой стороны, мы обычно не говорим на юридическом языке, однозначные и чрезвычайно тщательно сформулированные предложения зарезервированы для текстов, подобных Стандарту). Также может быть, что автор ошибся или стандарт изменился, но так как у меня нет версии C++03, то придется ждать более информированного человека :) - person Matthieu M.; 12.02.2011
comment
Спецификаторы доступа не влияют на видимость. Спецификаторы доступа влияют на доступность. - person Fred Nurk; 22.02.2011
comment
@Fred: Есть ли разница между этими словами в этом контексте? Под видимостью я подразумеваю то же самое, что вы имели в виду под доступностью. - person Nawaz; 22.02.2011
comment
@Fred: Что это значит? :-/ - person Nawaz; 22.02.2011
comment
Что значит да? Остальное требуется SO, потому что комментарии не могут быть короче 15 символов. Или вы имели в виду что-то другое, потому что отредактировали предыдущий комментарий? - person Fred Nurk; 22.02.2011
comment
Если вы имеете в виду доступность, почему вы не говорите «доступность» вместо того, чтобы использовать неправильное слово? - person Fred Nurk; 22.02.2011
comment
@Fred: На самом деле ваше «да» ничего не объясняет. В чем разница? - person Nawaz; 22.02.2011
comment
@Fred: Что может означать видимость в этом контексте? - person Nawaz; 22.02.2011
comment
Если хотите сказать в чем разница, то говорите что вместо есть ли разница :) Недоступные члены все равно видны. Перегрузки — хороший пример, потому что именно здесь вы можете скрыть члены: производный метод скрывает базовый метод с тем же именем. - person Fred Nurk; 22.02.2011

Из n3225, 9.2 [class.mem] примечание 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);

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

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

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

person Matthieu M.    schedule 12.02.2011