2017-02-20 4 views
2

Когда мы говорим о выравнивании, мы всегда ссылаемся на переменные внутри структуры, а не на отдельные переменные.выравнивание при обращении к structs vs variables

не могли бы вы рассказать мне, почему это так? , когда мы имеем в виду переменную, возьмет ли он весь размер «слова»?

ответ

0

Скорее всего, потому что, если вы возитесь с выравниванием переменных, вы либо находитесь в мире оптимизации низкого уровня (на основе оценок линии кэша и еще чего-то), либо занимаетесь программированием встраивания.

Большинство разработчиков этого не делают, и те, кто это делает, с большей вероятностью будут читать свои спецификации на пластинках и переосмысливать принципы выравнивания, которые они, вероятно, уже знают, а не обсуждают это в Интернете (есть исключения, конечно, это просто не общая тенденция).

У меня есть еще увидеть переменную alignement, которая не является дериват:

// the array "cacheline" will be aligned to 128-byte boundary 
alignas(128) char cacheline[128]; 

С другой стороны, вам не нужно очень конкретные ситуации, чтобы увидеть влияние совокупного (структуры) выравнивание по программе.

Это то, что новичок будет писать и вопрос в какой-то момент или иначе:

#include <iostream> 

struct no_align 
{ 
    char c; 
    double d; 
    int i; 
}; 

struct align 
{ 
    double d; 
    int i; 
    char c; 
}; 

int  main(void) 
{ 
    no_align  no_align_array[100]; 
    align   align_array[100]; 

    std::cout << sizeof(no_align_array) << std::endl; 
    std::cout << sizeof(align_array) << std::endl; 
} 

На моей машине результат:

2400 
1600 

И это та точка, где вы будете идти вокруг в Интернете спрашивает, почему в мире одна версия заставляет вас использовать 800 больше байтов, чем другие, если ни один из преподавателей не объяснил это вам.

0

Каждый тип имеет фиксированный размер и требование к выравниванию.

Структура имеет членов с собственными требованиями к выравниванию. Как логическое следствие, структура должна иметь требование выравнивания, по крайней мере такое же сильное, как и все его члены. Структуре, возможно, придется добавить прокладку, чтобы все ее члены соответствовали их требованиям к выравниванию.

В массиве последовательно хранится несколько элементов массива без каких-либо дополнений. В качестве логического результата размер любого типа должен быть кратным его требованию о выравнивании (поэтому структура, содержащая int и char, не может иметь требование к выравниванию в четыре байта и размер в пять байтов, поскольку это не сработает для второй элемент массива в массиве из двух таких структур).

Переменные должны иметь адреса, поэтому их требования к выравниванию удовлетворяются, поэтому ваше первое предложение неверно.

Однако существует правило «как есть»: обычно компилятор должен делать то, что говорит ему язык. Но правило «как-если» говорит, что компилятор может делать все, что он хочет, пока программа не может найти разницу. Поэтому, если сохранение int на невыровненном адресе не имеет значения (за исключением, может быть, крошечной стоимости во времени), компилятору разрешено это делать.

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