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

Поиск:

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


Опытный
**


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

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



Кто имел практику использования этого  на С++ ? В каких случаях это является целесообразным ? Какую пользу это может принести ?

Имеет в виду именно о том выравнивании на которое влияет сам программст в коде, а не компилятор и не система в целом.

Код

 #pragma pack (push, 1)

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


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


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

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



там, где нужно обеспечить требуемое бинарное расположение данных..

Добавлено через 3 минуты и 22 секунды
также в случаях когда выравнивание по умолчанию неприемлемо.. 


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


Опытный
**


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

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



Цитата

там, где нужно обеспечить требуемое бинарное расположение данных..

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

Цитата

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

я вот об этих случаях и спрашивал, кикие ето такие случаи ?)

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


uploading...
****


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

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



Цитата(cupper @  28.4.2011,  13:46 Найти цитируемый пост)
кроме как для записи и восстановления структуры в/из файла это когда может потребоется

Например процессор Intel гарантирует атомарность операций чтения и записи для выравненных 64-х битных объектов. Конечно, одним выравниванием членов структуры здесь не обойтись, сама структура тоже должна располагаться по "правильному" адресу, но все же...

100% требуемого выравнивания для конкретного объекта насколько мне известно добиться нельзя (имеется ввиду независимо от опций проекта, компилятора и пользовательских выравниваний). Я при реализации атомарных операций в MSVC ставил __declspec(align( # ))  + assert на корректное выравнивание.


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


Опытный
**


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

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



Цитата(azesmcar @ 28.4.2011,  13:58)
Например процессор Intel гарантирует атомарность операций чтения и записи для выравненных 64-х битных объектов. Конечно, одним выравниванием членов структуры здесь не обойтись, сама структура тоже должна располагаться по "правильному" адресу, но все же...

100% требуемого выравнивания для конкретного объекта насколько мне известно добиться нельзя (имеется ввиду независимо от опций проекта, компилятора и пользовательских выравниваний). Я при реализации атомарных операций в MSVC ставил __declspec(align( # ))  + assert на корректное выравнивание.

Цитата

Например процессор Intel гарантирует атомарность операций чтения и записи для выравненных 64-х битных объектов. Конечно, одним выравниванием членов структуры здесь не обойтись, сама структура тоже должна располагаться по "правильному" адресу, но все же...


это опять "для чего" а не "зачем". Понятия не приложу зачем может это понадобится. 

Бубуд конкретен, если например сервер обрабатывает типы какой то определенный структуры притом элементов этой самой структуры бесчисленное множество. Вот в этом случае выравнивание может дать либо выигрыш в памяти и проигрыш в производительности (когда у нас смещение будет 1 для полей структуры). Либо выигрыш в производительности и проигрыш в памяти (это вот как раз по умолчанию). Это единственный пример который я могу выдумать который как то может встретиться на практике. Например если этих объектов так много что не на первый план выходит именно не хватка памяти нежели скорость их обработки. 

Еще что то ?

А на счет жесткой последовательности байтов, это кроме как для простого сохранения структуры в файл и последующего восстановления, может для чего то понадобится ? Это по сути сераилазация получается, но без возможности использования указателей. И при условии фиксированных всех полей используемых в структуре. Опять таки можно, но зачем ? Ну хотя тут более легко найти причину. Сириальазция все таки какая никакая везде нужна.
PM MAIL   Вверх
azesmcar
Дата 28.4.2011, 14:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


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

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



Цитата(cupper @  28.4.2011,  14:22 Найти цитируемый пост)
Понятия не приложу зачем может это понадобится. 

В каком смысле? Не знаешь зачем нужна атомарность чтения/записи?

Цитата(cupper @  28.4.2011,  14:22 Найти цитируемый пост)
Это единственный пример который я могу выдумать который как то может встретиться на практике. Например если этих объектов так много что не на первый план выходит именно не хватка памяти нежели скорость их обработки. 

Мутный какой-то пример. В таком случае я бы пересмотрел саму структуру объектов. Отключение выравнивания - не выход а проблема переносимости.
PM   Вверх
baldina
Дата 28.4.2011, 14:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(cupper @  28.4.2011,  14:22 Найти цитируемый пост)
выигрыш в памяти и проигрыш в производительности

может случиться выигрыш в памяти и выигрыш в производительности, если при таких манипуляциях данные умещаются в размер строки кэша
PM MAIL   Вверх
cupper
Дата 28.4.2011, 14:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(azesmcar @ 28.4.2011,  14:28)


Цитата(cupper @  28.4.2011,  14:22 Найти цитируемый пост)
Это единственный пример который я могу выдумать который как то может встретиться на практике. Например если этих объектов так много что не на первый план выходит именно не хватка памяти нежели скорость их обработки. 

Мутный какой-то пример. В таком случае я бы пересмотрел саму структуру объектов. Отключение выравнивания - не выход а проблема переносимости.

Цитата

В каком смысле? Не знаешь зачем нужна атомарность чтения/записи?


64бита - 8 байт = double (к примеру), я как бы думаю что по умолчанию выравнивание в структурах в которых есть 64x битное поле будет 8 байт, для того что бы как раз атомарно работать с типом. Такое поведение по молчанию уже идет. Выравниванием возможно только нарушить этот порядок, тем самым считывание этого поля будет производится в несколько заходов, т.е. мы теряем в производительности, но выигрываем памяти. Вы об этом имел в виду ? Если нет тогда я не понял вас.

Для чего такое может понадобится я написал в предыдущем посте на примере большого числа элементов структуры. Но вы назвали пример мутным и я с вами соглашусь, он просто высосан из пальца, потому что я не знаю зачем может потребоваться нарушать стандартное выравнивание. Собстно я и создал тему что бы вы мне подкинули примеры из практики smile
PM MAIL   Вверх
Earnest
Дата 28.4.2011, 15:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

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



Цитата(cupper @  28.4.2011,  15:58 Найти цитируемый пост)
я как бы думаю что по умолчанию выравнивание в структурах в которых есть 64x битное поле будет 8 байт

Выравнивание будет такое, какое установлено в опциях компилятора, или локально, прагмами, и никак не зависит от того, что содержат твои структуры.
По умолчанию нонешние компиляторы действительно устанавливают 8... Но никто не мешает установить любое. Например, у меня в приложении, которое растет еще из досовских времен, установлено выравнивание = 2 - из соображений бинарной совместимости с древним форматом. В принципе, можно было бы ограничить это выравнивание  только теми модулями, которые загружают/выгружают данные или только этими сериализуемыми данными, но возиться сильно влом, других забот хватает... С другой стороны, некоторые сторонние библиотеки предполагают совершенно конкретное выравнивание, вот там и приходится прагмами обкладывать...
В общем, всякое бывает. Не нужно тебе это пока и слава богу; понадобится - вспомнишь.


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


Эксперт
****


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

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



мне на практике отключать выравнивание приходилось только для работы с данными предопределенного формата.
что бы не рассказывать про мутные железки, в качестве примера можно привести заголовок пакета IP
PM MAIL   Вверх
borisbn
Дата 28.4.2011, 15:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(cupper @  28.4.2011,  13:46 Найти цитируемый пост)
кроме как для записи и восстановления структуры в/из файла это когда может потребоется

при создании динамической библиотеки, которую будут использовать необязательно в том же компиляторе. например, ты делаешь библиотеку (скажем, на студии) вот с таким интерфейсом
Код

// #pragma pack( push, 4 )
struct S {
    int i;
    char c;
};
// #pragma pack( pop )

void foo( const S * pS, int count );

и отдаёшь мне вот этот h-ник (с заремленными строками) и dll-ку. у тебя в проекте установлено выравнивание на 8, а у меня (скажем в билдере) - на 4.


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


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


Опытный
**


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

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



Цитата(borisbn @ 28.4.2011,  15:40)
при создании динамической библиотеки, которую будут использовать необязательно в том же компиляторе. например, ты делаешь библиотеку (скажем, на студии) вот с таким интерфейсом
Код

// #pragma pack( push, 4 )
struct S {
    int i;
    char c;
};
// #pragma pack( pop )

void foo( const S * pS, int count );

и отдаёшь мне вот этот h-ник (с заремленными строками) и dll-ку. у тебя в проекте установлено выравнивание на 8, а у меня (скажем в билдере) - на 4.

о как, теперь предельно понятно для чего используется. 

Только уточните как. 
Я не понял а зачем они закоменчены ?

Ведь на моем компиляторе с выравниванием 8 эта стукрута будет 16 байт занимать. И вся библиотека будет это знать.
Когда я отдаю вам, с вашим 4 байтным выравниванием, у вас библиотека будет все так же работать со стуктурой выравненной на 8 байт. А ваш код будет думать что она выравнена на 4 байта. Выйдет эпик файл. 

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

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


Эксперт
****


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

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



Цитата(cupper @  28.4.2011,  15:55 Найти цитируемый пост)
Тогда нужно что бы в хедере строки были раскоменчены, и либо у вас либо у меня выравнивание будет "не совсем удачное" что скажется на производительности, но зато будет работать в обоих случаях.так ?


именно. я специально их заремил, чтобы показать, что будет эпик фэил/фэйл/фейл... хз. fail, короче smile

Цитата(cupper @  28.4.2011,  15:55 Найти цитируемый пост)
Ведь на моем компиляторе с выравниванием 8 эта стукрута будет 16 байт занимать

нет. она будет занимать ровно 5, а вот следующая будет начинаться через 8.
При такой структуре
Код

struct S {
    int x; 
    int y;
    char c;
}

одна структура будет занимать 9 байт, а следующая будет идти через 16.

Это всё при условии 32-х битой архитектуры, ессно, т.к. int ... дальше, думаю, можно не продолжать

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


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


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


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

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



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

никак ?!  smile 


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


Опытный
**


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

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



Цитата(borisbn @ 28.4.2011,  16:04)
нет. она будет занимать ровно 5, а вот следующая будет начинаться через 8.

Теперь в целом все понятно. Но. Я был уверен (так прочитал в разных местах) что прагма для выравнивания задает выравнивание полей структуры а не самой структуры. 

что то вроде:
int - первое поле,  размер 4 байта, начинает от 0 байта, выравнивание 8 байт
char - второе поле, размер 1 байт, начинает от 0+8 байт, выравнивание 8 байт. 
Итого получаем что структура имеет как бы два поля по 8 байт, хотя в первой используется 4, в втором 1. Остальное мусор для выравнивания.

А для того что бы структура из char и int занимала ровно 5 байт, смещение должно быть 1 байт. Тогда поля просто будут следовать друг за другом, и структура будет 5 байт.


А вот ваш случай, что сама стуктура 5 байт (внутри структуры выравнивание на 1 байт) но выравнивание самой структуры 8 байт. Это не совсем понятно как так. Даже если предположить что прагма задает выравнивание не полей а самой структуры, то выравнивание внутри структуры точно не будет 1 байт, а будет таким какой задано в системе, или же по умолчанию будет максимальному размеру поля структуры.

не так ?)
PM MAIL   Вверх
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   Вверх
mes
Дата 29.4.2011, 12:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(bsa @  29.4.2011,  10:20 Найти цитируемый пост)
Вообще-то, я имел в виду, что минимальный

а я почему то думал, что то высказывание, в котором засомневался, принадлежит Earnest.. smile

Добавлено через 3 минуты и 3 секунды
Цитата(bsa @  29.4.2011,  10:20 Найти цитируемый пост)
что минимальный размер выравнивания не зависит от размера содержимого. 

хм... а что подразумевается под минимальным размером выравнивания ?



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


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

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



Цитата(bsa @  29.4.2011,  12:20 Найти цитируемый пост)
 Так как перед этим было высказывание, что мол если есть double, то все остальное тоже будет равняться по 8 байт. 

Я тоже именно на это отвечала


--------------------
...
PM   Вверх
asmdzen
Дата 30.4.2011, 10:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



**


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

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



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

struct hdr{
char id;
int sess_id;
short len;
char flags;
};


проблема состояла именно в том что я брал размер заголовка при помощи sizeof(hdr), который был неправильным.
PM MAIL   Вверх
volatile
Дата 1.5.2011, 00:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(cupper @  28.4.2011,  16:13 Найти цитируемый пост)
int - первое поле,  размер 4 байта, начинает от 0 байта, выравнивание 8 байт
char - второе поле, размер 1 байт, начинает от 0+8 байт, выравнивание 8 байт. 

Не, не так, чар по-любому будет идти сразу вслед за интом. Если бы там был инт64 вместо чара, тогда да.
Например стркутура из 2-ух чаров, при любом выравнивании будет иметь 2 байта длины.
Выравнивание начинает играть роль тогда, когда размер типа больше выравнивания, например:
struct S {
    char a;
    __int64 b; 
};
при выравнивании 1 - размер стркутуры - 9 байт
при 2 - размер стркутуры - 10 байт
при 4 - размер стркутуры - 12 байт
при 8 - размер стркутуры - 16 байт
и дальше при любом выравнивании, размер будет 16 байт.

Добавлено через 4 минуты и 50 секунд
Упс, сори, тут еще 3 страницы, после того поста, извиняюсь, не заметил.

Добавлено через 11 минут и 34 секунды
Ну прочитал 3 страницы. вобщем-то этой мысли вроде не было. так что оставляю.

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


Опытный
**


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

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



Цитата

при 8 - размер стркутуры - 16 байт


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

http://liveworkspace.org/code/46f54a6f9b75...fd6707aa49d1fb9

и на компиляторе VS оно как раз 16.

Экспериментальным путем и путем проб и ошибок вроде бы пришли к мнению что выравнивание везде работает одинаково только для 1, 2, и 4.
PM MAIL   Вверх
Страницы: (3) [Все] 1 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

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

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

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

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


 




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


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

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