Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [C++] Выравнивание данных 
:(
    Опции темы
bsa
Дата 28.4.2011, 16:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



Цитата(mes @  28.4.2011,  16:06 Найти цитируемый пост)
никак ?!

т.е. ты считаешь, что размер следующих структур будет разным (при условии sizeof(double) == 8, sizeof(int) == 4)?
Код
struct S1
{
   double x;
   char y;
};

struct S2
{
   char z;
   int x, y;
};

PM   Вверх
cupper
Дата 28.4.2011, 16:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 525
Регистрация: 29.11.2006

Репутация: 1
Всего: 1



поспешил я сказать что выравнивание по идет по максимальному типу. Но тут либо я неправильные мануалы читал, либо я из не правильно понял, что вероятнее.
к примеру размер структуры
Код

#pragma pack( push, 8 )
struct S1
{
   char y;
   double x;
};
#pragma pack( pop )

будет 12байт, тогда я не понимаю смысл выравнивание на 8. Вернее как оно работает в этом случае.


Но я правильно сказал что
Код

#pragma pack( push, 8 )
struct S2
{
   int x;
   char z;
};
#pragma pack( pop )


будет не 5 байт. Она 8 байт, независимо идет ли выравнивание на 4 или на 8, потому что они кратны ?

Это сообщение отредактировал(а) cupper - 28.4.2011, 16:51
PM MAIL   Вверх
bsa
Дата 28.4.2011, 16:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



Цитата(cupper @  28.4.2011,  16:46 Найти цитируемый пост)
будет 12байт

Ты хоть проверял? У меня размер получился 16.
PM   Вверх
borisbn
Дата 28.4.2011, 17:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 22
Всего: 135



Господа, у меня к Вам, кажется, плохие новости.
Код

#include <iostream>

#define FIELD_OFF( T, field ) (int)( (void*)( &( (T*)0 )->field ) )
int main() {

#pragma pack( push, 8 )
    struct S1_8 {
        double x;
        char y;
    };

    struct S2_8 {
        char z;
        int x, y;
    };
#pragma pack( pop )

    std::cout << "sizeof( S1_8 ) = " << sizeof( S1_8 ) << std::endl;
    std::cout << "sizeof( S2_8 ) = " << sizeof( S2_8 ) << std::endl;
    std::cout << "FIELD_OFF( S1_8, x ) = " << FIELD_OFF( S1_8, x ) << std::endl;
    std::cout << "FIELD_OFF( S1_8, y ) = " << FIELD_OFF( S1_8, y ) << std::endl;
    std::cout << "FIELD_OFF( S2_8, z ) = " << FIELD_OFF( S2_8, z ) << std::endl;
    std::cout << "FIELD_OFF( S2_8, x ) = " << FIELD_OFF( S2_8, x ) << std::endl;
    std::cout << "FIELD_OFF( S2_8, y ) = " << FIELD_OFF( S2_8, y ) << std::endl;

#pragma pack( push, 4 )
    struct S1_4 {
        double x;
        char y;
    };

    struct S2_4 {
        char z;
        int x, y;
    };
#pragma pack( pop )

    std::cout << "sizeof( S1_4 ) = " << sizeof( S1_4 ) << std::endl;
    std::cout << "sizeof( S2_4 ) = " << sizeof( S2_4 ) << std::endl;
    std::cout << "FIELD_OFF( S1_4, x ) = " << FIELD_OFF( S1_4, x ) << std::endl;
    std::cout << "FIELD_OFF( S1_4, y ) = " << FIELD_OFF( S1_4, y ) << std::endl;
    std::cout << "FIELD_OFF( S2_4, z ) = " << FIELD_OFF( S2_4, z ) << std::endl;
    std::cout << "FIELD_OFF( S2_4, x ) = " << FIELD_OFF( S2_4, x ) << std::endl;
    std::cout << "FIELD_OFF( S2_4, y ) = " << FIELD_OFF( S2_4, y ) << std::endl;
    
#pragma pack( push, 1 )
    struct S1 {
        double x;
        char y;
    };

    struct S2 {
        char z;
        int x, y;
    };
#pragma pack( pop )

    std::cout << "sizeof( S1 ) = " << sizeof( S1 ) << std::endl;
    std::cout << "sizeof( S2 ) = " << sizeof( S2 ) << std::endl;
    std::cout << "FIELD_OFF( S1, x ) = " << FIELD_OFF( S1, x ) << std::endl;
    std::cout << "FIELD_OFF( S1, y ) = " << FIELD_OFF( S1, y ) << std::endl;
    std::cout << "FIELD_OFF( S2, z ) = " << FIELD_OFF( S2, z ) << std::endl;
    std::cout << "FIELD_OFF( S2, x ) = " << FIELD_OFF( S2, x ) << std::endl;
    std::cout << "FIELD_OFF( S2, y ) = " << FIELD_OFF( S2, y ) << std::endl;
}

вот gcc (или minGW... что там на liveworkspace...):
Цитата

sizeof( S1_8 ) = 12
sizeof( S2_8 ) = 12
FIELD_OFF( S1_8, x ) = 0
FIELD_OFF( S1_8, y ) = 8
FIELD_OFF( S2_8, z ) = 0
FIELD_OFF( S2_8, x ) = 4
FIELD_OFF( S2_8, y ) = 8
sizeof( S1_4 ) = 12
sizeof( S2_4 ) = 12
FIELD_OFF( S1_4, x ) = 0
FIELD_OFF( S1_4, y ) = 8
FIELD_OFF( S2_4, z ) = 0
FIELD_OFF( S2_4, x ) = 4
FIELD_OFF( S2_4, y ) = 8
sizeof( S1 ) = 9
sizeof( S2 ) = 9
FIELD_OFF( S1, x ) = 0
FIELD_OFF( S1, y ) = 8
FIELD_OFF( S2, z ) = 0
FIELD_OFF( S2, x ) = 1
FIELD_OFF( S2, y ) = 5


http://liveworkspace.org/code/2c2d100a5a5e...1ac0e3beb06aa3c

а вот в студии 2008:
Цитата

sizeof( S1_8 ) = 16
sizeof( S2_8 ) = 12
FIELD_OFF( S1_8, x ) = 0
FIELD_OFF( S1_8, y ) = 8
FIELD_OFF( S2_8, z ) = 0
FIELD_OFF( S2_8, x ) = 4
FIELD_OFF( S2_8, y ) = 8
sizeof( S1_4 ) = 12
sizeof( S2_4 ) = 12
FIELD_OFF( S1_4, x ) = 0
FIELD_OFF( S1_4, y ) = 8
FIELD_OFF( S2_4, z ) = 0
FIELD_OFF( S2_4, x ) = 4
FIELD_OFF( S2_4, y ) = 8
sizeof( S1 ) = 9
sizeof( S2 ) = 9
FIELD_OFF( S1, x ) = 0
FIELD_OFF( S1, y ) = 8
FIELD_OFF( S2, z ) = 0
FIELD_OFF( S2, x ) = 1
FIELD_OFF( S2, y ) = 5


Это сообщение отредактировал(а) borisbn - 28.4.2011, 17:02


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
bsa
Дата 28.4.2011, 17:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



Код
$ gcc -v
Target: x86_64-linux-gnu
...
gcc version 4.5.2 (Ubuntu/Linaro 4.5.2-8ubuntu4)

$ test
sizeof( S1_8 ) = 16
sizeof( S2_8 ) = 12
FIELD_OFF( S1_8, x ) = 0
FIELD_OFF( S1_8, y ) = 8
FIELD_OFF( S2_8, z ) = 0
FIELD_OFF( S2_8, x ) = 4
FIELD_OFF( S2_8, y ) = 8


Добавлено через 1 минуту и 24 секунды
borisbn, у тебя студия, случаем, не 64-хбитный код генерит? А то есть подозрение, что pragma pack работает только на понижение выравнивания.
PM   Вверх
borisbn
Дата 28.4.2011, 17:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 22
Всего: 135



хммм. тогда как вот это понять ?
http://liveworkspace.org/code/d993132e2828...3646f22214910a1

P.S. Уже в третий раз прошу boostcoder'а высветить на морде liveworkspace'а версию компилятора... Может по русской сказочной традиции он в третий раз улсышит smile


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
mes
Дата 28.4.2011, 18:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(bsa @  28.4.2011,  15:14 Найти цитируемый пост)
т.е. ты считаешь, что размер следующих структур будет разным (при условии sizeof(double) == 8, sizeof(int) == 4)?

в качестве примера для размышления :
http://liveworkspace.org/code/99bfeb182277...ac92132b93409fa
 smile 
Код

struct S1
{      
        char   _1;            
        int    _2;        
        char   _3;    
};

struct S2
{      
        char   _1;            
        char   _2;         
        int    _3;            
};

struct S3
{      
        char  _1;            
        char  _2[sizeof(int)];         
        char  _3;
};

int main()
{
   
    std::cout
    << "sizeof (S1) = " << sizeof (S1) << std::endl
    << "sizeof (S2) = " << sizeof (S2) << std::endl
    << "sizeof (S3) = " << sizeof (S3) << std::endl    
    ;
}

Цитата

sizeof (S1) = 12
sizeof (S2) = 8
sizeof (S3) = 6


Добавлено через 7 минут и 37 секунд
Цитата(borisbn @  28.4.2011,  16:00 Найти цитируемый пост)
что там на liveworkspace...

gcc 4.6.0, если не ошибаюсь smile



Это сообщение отредактировал(а) mes - 28.4.2011, 18:29


--------------------
PM MAIL WWW   Вверх
cupper
Дата 28.4.2011, 21:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 525
Регистрация: 29.11.2006

Репутация: 1
Всего: 1



так ну всетаки pragma push задает выравнивание полей структуры а не самой структуры. Другое дело как она это делает.


Цитата

в качестве примера для размышления :

а тут почти все ясно, не считая первого случае, непонятно почему поле char после int выравнивается на размер int, это же не имеет смысла.
во втором случае, два чар записались подряд и выравнились по int который следует за ними.
в третьем, ну просто все char выравнились по своему размеру в 1 байт.
PM MAIL   Вверх
mes
Дата 28.4.2011, 21:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(cupper @  28.4.2011,  20:00 Найти цитируемый пост)
непонятно почему поле char после int выравнивается на размер int,

как это "поле char ... выравнивается ... " ?  smile 
выравнивается _стартовый_ адрес поля или размер структуры.. 


Это сообщение отредактировал(а) mes - 28.4.2011, 21:05


--------------------
PM MAIL WWW   Вверх
cupper
Дата 28.4.2011, 21:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 525
Регистрация: 29.11.2006

Репутация: 1
Всего: 1



Цитата(mes @ 28.4.2011,  21:04)
Цитата(cupper @  28.4.2011,  20:00 Найти цитируемый пост)
непонятно почему поле char после int выравнивается на размер int,

как это "поле char ... выравнивается ... " ?  smile 
выравнивается _стартовый_ адрес поля или размер структуры..

это так что поле char после int в структуре заняло на 1 байт как положено, а 4, т.е. как бы выровнило адрес для следующего поля структуры (как если бы следующим полем был опять int). Но оно же в данном конкретном случае является последним полем, и непонятно почему так. Если вам это очевидно тогда лучше объясните мне, ибо на все свои вопросы я получаю в ответ так же вопросы smile

PM MAIL   Вверх
borisbn
Дата 28.4.2011, 22:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 22
Всего: 135



Цитата(bsa @  28.4.2011,  17:08 Найти цитируемый пост)
borisbn, у тебя студия, случаем, не 64-хбитный код генерит?

нет. у меня и винда и студия 32-х разрядные

Цитата(mes @  28.4.2011,  18:27 Найти цитируемый пост)
Цитата(borisbn @  28.4.2011,  16:00 )что там на liveworkspace...gcc 4.6.0, если не ошибаюсь 

хммм. тогда почему там 
Цитата

sizeof( S1_8 ) = 12
sizeof( S2_8 ) = 12

а у bsa
Цитата(bsa @  28.4.2011,  17:08 Найти цитируемый пост)

$ gcc -vTarget: x86_64-linux-gnu
...
gcc version 4.5.2 (Ubuntu/Linaro 4.5.2-8ubuntu4)

$ test
sizeof( S1_8 ) = 16
sizeof( S2_8 ) = 12




Цитата(mes @  28.4.2011,  21:04 Найти цитируемый пост)
выравнивается _стартовый_ адрес поля или размер структуры.. 

причём выравнивается, судя по всему либо на 4 либо на 1.

Цитата(borisbn @  28.4.2011,  17:00 Найти цитируемый пост)
FIELD_OFF( S2_8, x ) = 4

Цитата(borisbn @  28.4.2011,  17:00 Найти цитируемый пост)
FIELD_OFF( S2_4, x ) = 4

Цитата(borisbn @  28.4.2011,  17:00 Найти цитируемый пост)
FIELD_OFF( S2, x ) = 1




--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
mes
Дата 28.4.2011, 23:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(borisbn @  28.4.2011,  21:03 Найти цитируемый пост)
причём выравнивается, судя по всему либо на 4 либо на 1.

либо на два smile
Код

struct S1
{      
        short   _1;
        char    _2;    
        short   _3;              
};



--------------------
PM MAIL WWW   Вверх
borisbn
Дата 28.4.2011, 23:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 22
Всего: 135



Цитата(mes @  28.4.2011,  23:13 Найти цитируемый пост)
либо на два

ага...
http://liveworkspace.org/code/4a641cbbf10a...9b0f1aa1504564c
чего-то я перестал понимать эту логику


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
mes
Дата 28.4.2011, 23:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(cupper @  28.4.2011,  20:00 Найти цитируемый пост)
а тут почти все ясно

пример приведен как контраргумент к высказыванию, что выравнивание никак не зависит от содержимого.. 

Цитата(cupper @  28.4.2011,  20:39 Найти цитируемый пост)
лучше объясните

под выравниванием подразумевается расположении с нужным смещением, т.е. не поле растягивается, а следующее за ним сдвигается на некоторое расстояние.. 
выравнивание размера структуры это косвенный эффект, от выравнивания первого поля следующей структуры, при расположении в массиве.. из за требования непрерывности.. 





--------------------
PM MAIL WWW   Вверх
bsa
Дата 29.4.2011, 11:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



Цитата(mes @  28.4.2011,  23:25 Найти цитируемый пост)
пример приведен как контраргумент к высказыванию, что выравнивание никак не зависит от содержимого.. 

Вообще-то, я имел в виду, что минимальный размер выравнивания не зависит от размера содержимого. Так как перед этим было высказывание, что мол если есть double, то все остальное тоже будет равняться по 8 байт.
PM   Вверх
Страницы: (3) Все 1 [2] 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0630 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.