LINUX.ORG.RU

[C] ? опция gcc для 16-битового выравнивания в структурах? вообще есть такое?

 


0

0

-mno-align-int почему-то не хочет брать

вообще это хоть возможно?

перевожу прогу из-под ДОСА\Винды, у меня структура, считываемая с файла, не соответствует по расположению полей, вот понял что long(int)выравнивается на границу слова, а как бы от этого отказаться?

и что, выравниевание дает какое-то ускорение работы?


Можно использовать: __attribute__((packed)), тогда выравнивания нет вообще.

Есть еще ключик: -mno-strict-align.

А ускорение... Сейчас все спорят дает или нет. Раньше для считывания не выровненных данных требовалось как минимум в два раза больше тактов процессора. А сейчас идет предвыборка и сложно сказать есть ли реальное преимущество.

rymis ★★
()

__attribute__ ((aligned (8))) ну или почем там досовский компилер ровнял.

nikolayd
()
Ответ на: комментарий от rymis

у меня ни того не другого нет почему-то -mno-strict-align мой gcc не знает равно как и __attribute__((packed))

компилятор нужен новый может?

у меня Debian Lenny

я пробовал также __attribute__((aligned (1))) __attribute__((aligned (2))) а это он берет, но ничего не выравнивает

а __attribute__((aligned (8))) - это получается на границу двойного слова (8 байт)

CoGo
() автор топика
Ответ на: комментарий от CoGo

извиняюсь,

__attribute__((packed))

работает, только не для структуры, а для переменных внутри

так что получилось!

спасибо!

CoGo
() автор топика

Почему бы не прочитать данные в какой-нибудь буфер и разложить по полям структуры вручную? Откуда такое желание реанимировать быдлокод "as is"?

mannaz
()
Ответ на: комментарий от mannaz

ну я бы так и поступил, если бы других вариантов не было

но это огромная прога и мне хочется бОльшую часть исходников оставить "в кроссплатформенном виде"

т.к. думаю еще долго все-таки основным вариантом проги будет Виндовый, а может даже на Линуксе не все и получится, что уже есть

CoGo
() автор топика
Ответ на: комментарий от CoGo

> мне хочется бОльшую часть исходников оставить "в кроссплатформенном виде"

__attribute__, конечно, добавляет кроссплатформенности

mannaz
()
Ответ на: комментарий от mannaz

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

а из файлов с текстами программ я пока нетронутыми сохранил процентов 90

я уже такую операцию проходил при переходе от ДОС на Win32

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

и то запаришься сравнивать - не забыл ли где обновить

CoGo
() автор топика
Ответ на: комментарий от CoGo

Вап предложили правильное решение - написать небольшую прослойку, раскладывающую данные по структурам. Такой вариант будет куда более кроссплатформенным и логичным.

staseg ★★★★★
()
Ответ на: комментарий от mannaz

лучше использовать

#pragma pack(push, байты)
структура
#pragma pack(pop)

это более переносимо

а по хорошему надо было структуры сериализовать

Reset ★★★★★
()
Ответ на: комментарий от Reset

Я о сериализации и говорил, или ты не тому ответил?

mannaz
()
Ответ на: комментарий от mannaz

> __attribute__, конечно, добавляет кроссплатформенности

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

______________________________________________

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

www_linux_org_ru ★★★★★
()
Ответ на: комментарий от www_linux_org_ru

pragma pack работает и для gcc и для msvc

Reset ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.