1 Как работает выравнивание?
Память для объектов выделяется в тех местах памяти, где выполняется требование выравнивания типа. То есть: для требования выравнивания N адрес ячейки памяти будет делиться на N.
1 По чему выравниваются элементы?
Объекты выровнены с любым выравниванием типа этого объекта в целевой системе. Это то же самое для всех объектов, включая объекты-члены.
2 Обращается ли большинство ЦП к адресам, кратным размеру слова?
Некоторые Процессоры действительно имеют доступ только к выровненным адресам.
2 Я считаю, что процессоры могут читать слово из памяти, начиная с любого байта. Я не прав?
В случае с каким-то процессором вы не ошибаетесь. Было бы неправильно полагать, что это применимо ко всем ЦП.
2 - Что лучше для ЦП получить доступ к типу данных N байтов, расположенному по адресу, кратному N?
На таком CPU, как упомянуто выше, адрес чтения, не кратный N (т.е. выровненный), приведет к сбою сегментации. Ошибка сегментации приведет к завершению процесса. Лучше, чтобы процесс не завершался до тех пор, пока он не завершит все, что должен был сделать.
На некоторых других процессорах доступ к памяти с выровненного адреса может быть быстрее. Быстрее - лучше.
Вероятно, на всех процессорах доступ к смещенной памяти не будет операцией atomi c. Лучше это или нет, зависит от того, что вы делаете.
3 - Почему компилятор не переупорядочивает элементы так, чтобы они занимали как можно больше места? Я не уверен, использует ли кто-нибудь фактические номера смещения для доступа к элементам.
Поскольку язык гарантирует порядок элемента, программист может положиться на эту гарантию, независимо от того, думаете ли вы, что кто-то сделает это или нет . Есть несколько редких вариантов использования, на которые можно положиться.
Однако гарантии для программистов не обязательно являются единственной проблемой с произвольным порядком членов. Другой аспект - совместимость библиотек с отдельными компиляторами. Все задействованные компиляторы должны согласовать порядок членов. Указанный порядок - это порядок объявления.
4 - Я читал, что это больше не важно и что теперь процессоры обычно могут получать доступ к невыровненным элементам, занимая то же время, что и выровненные. Это правда? Если да, то почему?
Это чрезмерно обобщенное утверждение. Это может быть верно для некоторых процессоров в некоторых случаях использования. Я рекомендую не считать такое общее утверждение универсальной истиной.
Если бы мы предположили, что это верно для определенного c ЦП, причиной этого могло бы быть то, что такой новый ЦП может получить доступ к невыровненным память, в то время как более ранний процессор не мог (например, старый ARMv4).
В другом случае, когда более ранний процессор мог, возможно, читать и писать без выравнивания, но такие операции могли быть медленнее. Если бы на новом ЦП операции имели эквивалентную скорость, то выравнивание могло бы стать неважным.
Старые ЦП все еще используются и не исчезли.