Question

Pour utiliser OSAtomicDecrement (fonctionnement atomique spécifique-mac), je fournir un SINT32 aligné sur 4 octets.

Est-ce que ce genre de travail de cuisine? Y at-il une autre façon de traiter les problèmes d'alignement?

struct SomeClass {
  SomeClass() {
    member_  = &storage_ + ((4 - (&storage_ % 4)) % 4);
    *member_ = 0;
  }

  SInt32 *member_;

  struct {
    SInt32 a;
    SInt32 b;
  } storage_;
};
Était-ce utile?

La solution

Si vous êtes sur un Mac, cela signifie que GCC. GCC peut aligner automatiquement les variables pour vous:

  __attribute__((__aligned__(4))) int32_t member_;

S'il vous plaît noter que ce ne sont pas portables compilateurs à travers, comme cela est spécifique GCC.

Autres conseils

Je suppose que tout SINT32 est déjà aligné, même sur un mac.

Pour préciser:

struct Foo {
    SInt32 member;
};

membre est toujours aligné correctement, à moins que vous emballez la structure et mettez membre après char.

ints sont quatre octets alignés par défaut avec l'un des compilateurs OS X. Tout ce que vous devez faire est de ne pas casser intentionnellement que l'alignement (par exemple en faisant pointer un mauvais moulages, le marquage de votre structure packed, etc).

Je sais que rien limites sur la programmation Mac mais que j'ai utilisé des mini-ordinateurs pour travailler, les pointeurs étaient toujours alignés sur 4 octets (mot). IIRC, struct étaient trop. la mémoire a toujours été Numéroté.

Si votre compilateur prend en charge TR1 (ou C ++ 0x), vous pouvez utiliser le modèle de std::aligned_storage.

Pour allouer de l'espace pour un objet avec la taille S et A d'alignement, vous pouvez affecter un objet de type std::aligned_storage<S, A>::storage.

(L'espace de nom peut varier entre compilateurs. Je pense que TR1 ne précise pas quel espace les extensions doivent être placés dans. Sur MSVC, l'espace de noms std::tr1 est utilisé)

En dehors de cela, sont déjà alignés sur 4 octets entiers de 32 bits par le compilateur (au moins sur les plates-formes où l'alignement naturel des ints de 32 bits est de 4 octets)

Si vous voulez forcer un alignement agréable dans une structure, vous pouvez utiliser des champs de bits.

struct 
{
   Foo _hisFoo;
   unsigned int dummyAlignment : 0;
   Foo _myFoo;
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top