Излишно ли е да съхранявате двоен член на структура на адрес, кратен на 8?

Да предположим, че sizeof(int) и sizeof(double) са съответно 4 и 8 и че преди това няма команда на препроцесор като #pragma pack следния код или опции на компилатора със същата функция като #pragma pack, използван в командния ред на компилатора

typedef struct
{
    int n;
    double d;
} T;

тогава колко е sizeof(T)?

Мисля, че зависи от ширината на шината за данни между процесора и RAM. Ако ширината е 32 бита, sizeof(T) е 12. Ако ширината е 64 бита, sizeof(T) е 16. На компютър с 32-битова шина за данни, за прехвърляне на 64-битово число от CPU към RAM или обратно, процесорът трябва да има достъп до шината за данни два пъти, като чете или записва 32 бита наведнъж, така че няма смисъл да се съхранява член d на структурата T на адрес, кратен на 8.

Съгласен ли си?

(Съжалявам за лошия ми английски)


person xiaokaoy    schedule 26.09.2013    source източник
comment
Английският ти е много добър.   -  person Neil    schedule 26.09.2013


Отговори (1)


тогава колко е sizeof(T)?

Прав си, това силно зависи от системата, компилатора и настройките за оптимизация. Най-общо казано, компилаторът знае най-добре, поне на теория, какво подравняване да избере за 8-байтовия double член на структурата. Освен това решението на компилатора може да е различно, когато го помолите да оптимизира за по-малък отпечатък на паметта в сравнение с това, когато го помолите да оптимизира за най-бърза скорост.

И накрая, може да има системи, при които четенето на осем байта от адреси, подравнени на границата от четири байта, но не и на границата от осем байта, може да не носи никакво наказание. Отново, вашият компилатор е в най-добрата позиция да знае този факт и избягвайте да допълвате ненужно вашия struct.

Най-важното нещо, което трябва да запомните за подравняването, е, че не трябва да приемате конкретно оформление на вашия struct, дори ако не възнамерявате да пренесете продукта си на друга платформа, защото промяна, толкова проста, колкото добавянето на флаг за оптимизация към makefile може да е достатъчно, за да обезсили вашите предположения.

person Sergey Kalinichenko    schedule 26.09.2013
comment
+1 много добре казано и само да добавя, че някои от нас все още използват процесори, които са само 8 бита широки, C е много често срещано за микропроцесори и снимки. - person Dampsquid; 26.09.2013
comment
Мисля, че е много малко вероятно един компилатор да генерира различно подравнени структури с различни опции за оптимизация. Обикновено все пак бихте искали този код, който е компилиран с различна оптимизация, да може да бъде свързан заедно. - person Jens Gustedt; 26.09.2013