Смещение чего-либо - это количество единиц с начала.Во-первых, при начале, поэтому его смещение равно нулю.
Подумайте, как ваша структура находится в ячейке памяти 100:
100: class X { int a;
104: int b;
108: int c;
Как вы можете видетьадрес a
совпадает с адресом всей структуры, поэтому его смещение (то, что вы должны добавить к адресу структуры, чтобы получить адрес элемента) равно 0.
Обратите внимание, что ISOСтандарт не указывает, где элементы расположены в памяти.Заполнение байтов для создания правильного выравнивания, безусловно, возможно.В гипотетической среде, где целые числа были только два байта, но их требуемое выравнивание было 256 байтов, они не были бы в 0, 2 и 4, а скорее в 0, 256 и 512.
И, еслита книга, из которой вы берете отрывок, действительно Inside the C++ Object Model
, она становится немного длиннее в зубе.
Тот факт, что она написана в 96-м и обсуждает внутренности под C ++ (растёт лирические слова о том, насколько она хороша)это знать, где находится vptr
, упуская весь смысл в том, что , работающий на неправильном уровне абстракции, и вам никогда не стоит волноваться, ) встречает его совсем немного.На самом деле, во введении даже говорится «Объясняется базовая реализация объектно-ориентированных функций ...» (мой курсив).
И тот факт, что никто не может найти что-либо в ISOстандартное высказывание о том, что такое поведение является обязательным, а также тот факт, что ни MSVC, ни gcc не действуют таким образом, заставляет меня поверить, что, даже если это было верно для одной конкретной реализации в далеком прошлом, это не так (или требуется, чтобы быть правдой)all.
Автор, по-видимому, возглавлял команды cfront 2.1 и 3, и, хотя эта книга представляет исторический интерес, я не думаю, что она имеет отношение к современному языку C ++ (и его реализации), по крайней мере, к тем битам, которые япрочитал.