Gowtham Gampala Ответов: 2

Как я...понимаю это(заполнение invlolved)?


#include <stdio.h>
#include <string.h>

/*  Below structure1 and structure2 are same.
    They differ only in member's allignment */
//#pragma pack ( 1 )
struct structure1
{
        char  _1;
        short int _2;
        char _3;
};


int main()
{
    struct structure1 a;

    printf("size of structure1 in bytes : %d\n",sizeof(a));
    printf ( "\n   Address of id1        = %u", &a._1 );
    printf ( "\n   Address of id2        = %u", &a._2 );
    printf ( "\n   Address of name       = %u", &a._3 );


    getchar();
    return 0;
}


Что я уже пробовал:

tried on 32 bit compiler!
why am i getting 6 bytes??shoulnt i get 8 bytes...as there i padding involved here!!
as it always reads 4 bytes at a time!!

2 Ответов

Рейтинг:
20

OriginalGriff

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

struct structure1
{
        char  _1;
        char _3;
        short int _2;
};
и это будет 4 байта.


Gowtham Gampala

Но компилятор всегда читает 4 байта правильно!!
4 + 4 это означает, что 2 байта какого-то другого адреса также будут прочитаны правильно!!

OriginalGriff

Почему ты так думаешь?
Процессор будет-или, скорее всего, 8 байт, или даже 16 (больше в некоторых случаях, если Оперативная память имеет "пакетный режим", который делает это более эффективным) и хранит их во внутреннем кэше (переменной ширины) на случай, если они понадобятся позже.
И в зависимости от использования он может даже не попасть в память - он может быть переведен во внутренние регистры процессора и остаться там!

Это ужасно сложно, но есть много того, что называется предварительной загрузкой, когда вы смотрите на то, что делает современный процессор во имя эффективности-и это не обязательно кажется эффективным, если смотреть изолированно.

Gowtham Gampala

#include < stdio.h>
#include & lt;string.h>

/ * Ниже structure1 и structure2 одинаковы.
Они различаются только расположением членов */
//#pragma pack ( 1 )
структура structure1
{
короткий int _1;
инт _2;
короткий int _3;
};


тап_п()
{
структура structure1 a;

printf ("размер структуры 1 в байтах: %d\n", sizeof(a));
printf ("\n адрес id1 = %u", & a. _1 );
printf ("\n адрес id2 = %u", & a. _2 );
printf ("\n адрес имени = %u", & a. _3 );


функция getchar();
возвращает 0;
}



Это означает, что размер этой структуры должен быть 10 байт правильно!Но это же 12 байт!!

OriginalGriff

И ваша модифицированная версия: Нет, это не 10 байт, это двенадцать.
короткий-2 байта
заполнение-2 байта для приведения адреса к границе 4 байта
int - 4 байта
короткий-2 байта
заполнение-2 байта, чтобы вся структура выровнялась по 4-байтовой границе.

Gowtham Gampala

Спасибо вам сэр :)

Gowtham Gampala

Это яркое объяснение!!

Gowtham Gampala

Сэр, пожалуйста, объясните и это..
согласно вашему объяснению
char 1byte +(3, чтобы сохранить int в 4-байтовой границе)
int 4 байта и
char занимает 4 байта или 2 байта??
структура structure1
{
чар _1;
инт _2;
чар _3;
};

OriginalGriff

char-1
pad-3
инт-4
char-1
pad-3
Итого= 12 байт.

Gowtham Gampala

Как это изменится, если это 16-битный компилятор??

OriginalGriff

Зависит от целевого процессора. Некоторые из меньших могут обращаться к целым числам на нечетных адресных байтовых границах.
Серьезно: перейдите по ссылке CPallini, и вы узнаете больше, чем вам когда-либо нужно будет знать! :смеяться:

Рейтинг:
1

OriginalGriff

Очень хорошая ссылка - хорошо объяснено, что. +5