Я читал главу в Beautiful Code в ядре Linux, и автор обсуждает, как ядро Linux реализует наследование на языке C (среди другие темы). В двух словах определена "базовая" структура, и для того, чтобы наследовать от нее, структура "подкласса" помещает копию базы в конце определения структуры подкласса. Затем автор проводит пару страниц, объясняя умный и сложный макрос, чтобы выяснить, сколько байтов назад, чтобы преобразовать из базовой части объекта в часть подкласса объекта.
Мой вопрос: В структуре подкласса, почему бы не объявить базовую структуру как первую вещь в структуре, а не последнюю вещь?
Основным преимуществом размещения базового элемента структуры в первую очередь является приведение от базы к подклассу, в котором вам не нужно будет перемещать указатель вообще - по существу, выполнение акта просто означает указание компилятору позволить вашему коду использовать "дополнительные" поля, которые структура подкласса разместила после материала, определяемого базой.
Просто, чтобы немного разъяснить мой вопрос, позвольте мне выделить код:
struct device { // this is the 'base class' struct
int a;
int b;
//etc
}
struct usb_device { // this is the 'subclass' struct
int usb_a;
int usb_b;
struct device dev; // This is what confuses me -
// why put this here, rather than before usb_a?
}
Если у человека есть указатель на поле "dev" внутри объекта usb_device, то для того, чтобы вернуть его обратно к этому объекту usb_device, нужно вычесть 8 из этого указателя. Но если "dev" было первым делом в использовании usb_device, то указателю вообще не нужно было бы перемещать указатель.
Любая помощь по этому поводу будет очень признательна. Даже совет о том, где найти ответ, будет оценен по достоинству - я не совсем уверен, как Google за архитектурную причину такого решения. Самый близкий, который я мог найти здесь, в StackOverflow: зачем использовать эту странную структуру вложенности
И, чтобы быть понятным - я понимаю, что многие яркие люди долгое время работали над ядром Linux, так что у него есть веская причина для этого, я просто не могу понять, что это такое.