Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Программирование под Unix/Linux > Выравнивание структур по GCC-шному!


Автор: EvilsInterrupt 24.9.2010, 13:09
В gcc есть старый тип выравнивания, описанный http://gcc.gnu.org/onlinedocs/gcc-3.2.3/gcc/Type-Attributes.html , вот цитато:
Цитата

aligned (alignment) 
This attribute specifies a minimum alignment (in bytes) for variables of the specified type. For example, the declarations: 
          struct S { short f[3]; } __attribute__ ((aligned (8)));
          typedef int more_aligned_int __attribute__ ((aligned (8)));


Прошу написать, кого-нибудь пример простой структуры выравненой на 1, 2, 4 и 8 байт! 

Для чего  нужно?

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

#if (SDK_COMPILER==SDK_COMPILER_GNUC)
  #define  PACKED_STRUCT  __attribute__ ((packed))
#else
  #define  PACKED_STRUCT
#endif


применять буду так:

Код

#include <PshPack1.h>

typedef struct _FILE_HEADER {
  uint32_t  signature;
  uint64_t  offset;
// много полей дальше
} PACKED_STRUCT  FILE_HEADER;

#include <PopPack.h>


как видно для MSVC придумано выравнивание, а вот для GCC еще нет! ;) Потому прошу написать примеры, под рукой GCC , к сожалению (

ЗЫ:
Предвидя вопросы "А почему нельзя заюзать совместимое с MSVC #pragma push ?" скажу что этого требует ситуация! Поэтому то выравнивание что поддерживает современный GCC очень нравится, но нужно и на старые, такова ситуация!

Автор: null56 26.9.2010, 03:36
Цитата(EvilsInterrupt @  24.9.2010,  13:09 Найти цитируемый пост)
Прошу написать, кого-нибудь пример простой структуры выравненой на 1, 2, 4 и 8 байт! 

может быть как - то так
Код

#define ALIGN_FACT 8
#define ALIGN __attribute__((aligned(ALIGN_FACT)))

struct __attribute__((packed)) MyStruct
{
        char ALIGN a;
        int ALIGN b;
        long ALIGN c;
        char ALIGN d;
};

int main()
{
        MyStruct my;
        printf("a = %d, b = %d, c = %d, d = %d\n", &my.a, &my.b, &my.c, &my.d);
        return 0;
}

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

Автор: EvilsInterrupt 26.9.2010, 09:39
null56, 
Буду рад если обратишь внимание на мою просьбу:
>>Прошу написать, кого-нибудь пример простой структуры выравненой на 1, 2, 4 и 8 байт! 

smile Она говорит о том что нужно написать структуру и добавить директив выравнивающих на  границу 1 или 2 или 4 или 8. Мне  нужен пример! ;)
Зная как это делается в GCC , смогу сделать это портабельно!

Автор: EvilsInterrupt 26.9.2010, 14:30
нашел интересную тему http://www.gamedev.net/community/forums/topic.asp?topic_id=495691 , но как-то не совсем удобно  в использовании

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)