2008-11-14 2 views
1

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

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

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

ответ

3

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

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

+0

Спасибо за ответ, это довольно однозначно. Интересно, есть ли там компиляторы, которые используют эту возможность для уменьшения заполнения внутренних объектов. – 2012-04-07 16:37:29

2

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

Хорошо, теперь я думаю, что компиляторы могут это сделать. Стандарт гласит в 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).

1

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

Смежные вопросы