Можно ли чередовать разделы доступа C++?

Стандарт C++ устанавливает порядок для переменных-членов класса в памяти. В нем говорится, что адреса переменных-членов должны увеличиваться в порядке объявления, но только внутри одной секции доступа. В частности, это не мешает компиляторам размещать разделы доступа чередующимся образом. Например:

class X {
public:
   int i;
   int j;
private:
   int k;
   int n;
}

Позволяет ли стандарт компиляторам располагать элементы данных в порядке i, k, j, n? Это даст компиляторам некоторую (ограниченную) свободу в оптимизации макета объекта без нарушения стандарта.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
233
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

И нет, я думаю, он НЕ пытается спамить. Это правильный вопрос и, я думаю, довольно интересный.

Хорошо, теперь я думаю, что компиляторы могут это сделать. Стандарт говорит в 9.2. p12:

Implementation alignment require- ments might cause two adjacent members not to be allocated immediately after each other; so might requirements for space for managing virtual functions (10.3) and virtual base classes (10.1).

Я интерпретирую стандарт следующим образом: поскольку между i и j нет спецификатора доступа, адрес i должен стоять перед адресом j. Предлагаемый порядок соответствует этому. То же для k и n. Итак, в моей интерпретации компиляторы являются разрешили использовать этот порядок.

Ответ принят как подходящий

Я проверил стандарт C++. В разделе 9.2, абзаце (или пункте, или другом) 12, говорится: «Порядок распределения нестатических элементов данных, разделенных спецификатором доступа, не определен». «Не указано» означает поведение, зависящее от реализации, которое не нужно документировать.

Следовательно, в стандарте ничего не говорится о распределении, за исключением того, что i должно предшествовать j, а k должно предшествовать n. Следовательно, компилятору разрешено выделять ресурсы в порядке i, k, j, n, и ничего о порядке не требуется документировать.

Спасибо за ответ, это однозначно. Интересно, есть ли какие-нибудь компиляторы, которые используют эту возможность для уменьшения заполнения внутри объектов.

Koen Van Damme 07.04.2012 20:37

Другие вопросы по теме