Как я прокомментировал в ответе @Nawaz, технически это зависит исключительно от компилятора.
Компилятору просто поручено взять действительный код C ++ и вывести действительный машинный код (или любой другой язык, на который он нацелен).
Таким образом, компилятор C ++ мог решить сделать int
размером 15 и потребовать, чтобы он был выровнен по 5-байтовым границам, и он мог решить вставить произвольное заполнение между переменными в POD. Ничто в стандарте не запрещает этого, и он все равно может генерировать рабочий код.
Просто было бы намного медленнее.
Таким образом, на практике компиляторы получают некоторые подсказки от системы, в которой они работают, двумя способами: - ЦП имеет определенные предпочтения: например, он может иметь 32-битные регистры, поэтому создание int
32-битной ширины будет хорошая идея, и обычно требуется, чтобы переменные были естественным образом выровнены (например, переменная шириной 4 байта должна быть выровнена по адресу, кратному 4), поэтому разумный компилятор уважает эти предпочтения, потому что он дает более быстрый код. - ОС тоже может иметь некоторое влияние, поскольку, если она использует другой ABI, чем компилятор, выполнение системных вызовов будет излишне трудным.
Но это всего лишь практические соображения, призванные облегчить жизнь программисту или сгенерировать более быстрый код. Они не обязательны.
Последнее слово остается за компилятором, и он может полностью игнорировать как ЦП, так и ОС. Пока он генерирует рабочий исполняемый файл с семантикой, указанной в стандарте C ++.
person
jalf
schedule
30.12.2010