URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 4763
[ Назад ]

Исходное сообщение
"sizeof выдает неверный размер"

Отправлено Nik , 25-Окт-05 13:29 
Есть некоторая структура, указателей не содержит. sizeof для этой структуры выдает, ну скажем, 32 байта, хотя реальный размер структуры меньше. Знаю, что в МС вижал Си есть такая штука как выравнивание, и когда этому выравниванию говоришь byte, то sizeof на мою структуру выдает верный размер. Что нужно сказать gcc (какую опцию включить или выключить), чтобы sizeof на структуру выдавал корректный размер?
В мане на gcc куча всяких алигнментов, какой нужен в моем случае, я так и не понял. Помогите плиз.

Содержание

Сообщения в этом обсуждении
"sizeof выдает неверный размер"
Отправлено Heil , 25-Окт-05 13:40 
>Есть некоторая структура, указателей не содержит. sizeof для этой структуры выдает, ну
>скажем, 32 байта, хотя реальный размер структуры меньше. Знаю, что в
>МС вижал Си есть такая штука как выравнивание, и когда этому
>выравниванию говоришь byte, то sizeof на мою структуру выдает верный размер.
>Что нужно сказать gcc (какую опцию включить или выключить), чтобы sizeof
>на структуру выдавал корректный размер?
>В мане на gcc куча всяких алигнментов, какой нужен в моем случае,
>я так и не понял. Помогите плиз.

http://www.opennet.me/openforum/vsluhforumID9/4714.html

и не забывайте о следующем

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


"sizeof выдает неверный размер"
Отправлено Nik , 25-Окт-05 14:34 
спасибо. будем думать.

"sizeof выдает неверный размер"
Отправлено madskull , 25-Окт-05 17:18 
>спасибо. будем думать.

Может, поможет
#pragma pack()


"sizeof выдает неверный размер"
Отправлено horsh , 20-Ноя-05 21:11 
>>спасибо. будем думать.
>
>Может, поможет
>#pragma pack()

А вы уверены, что не лучше переписать вашу программу так
чтоб она работала с неупакованными структурами?

Вы уже столкнулись с тем что такая программа не переносима
и пытаетесь эту непереносимость усугубить.

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


"sizeof выдает неверный размер"
Отправлено jd , 21-Ноя-05 00:22 
А вам не кажется, что _почти месяц_ - это достаточный срок, чтобы не поднимать тему на самый верх, тем более обращаясь лично к человеку, который скорее всего уже давно забыл про свой вопрос?

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


"sizeof выдает неверный размер"
Отправлено horsh , 21-Ноя-05 03:28 
>А вам не кажется, что _почти месяц_ - это достаточный срок, чтобы
>не поднимать тему на самый верх, тем более обращаясь лично к
>человеку, который скорее всего уже давно забыл про свой вопрос?
>
>К вашему замечанию: бывают случаи, когда выравнивание данных использовать нельзя - например
>при работе с заданным форматом файла, корорый содержит невыровненные структуры...

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