2010-05-01 6 views
3

Est-il possible de spécifier l'alignement de la classe parente? par exemple quelque chose comme (qui n'a pas compilé):Alignement de la classe parent C++

template<size_t n> 
class Vector : public boost::array<double,n> __attribute__ ((aligned(16))) 
{ 

grâce

bien, des commentaires, je crois que c'est pas de bonne façon d'aller. Je pense que je vais juste coller à la composition/alignement de tableau privé

+0

Pourquoi voulez-vous faire cela? (et, dans ce cas, vous devriez utiliser la composition au lieu de l'héritage). –

+0

@James J'utilise maintenant la composition, mais je veux enlever la plaquette d'emballage. – Anycorn

+2

vous ne voudrez vraiment pas faire cela à long terme. Cela vous évite un peu de taper maintenant, mais au prix d'ouvrir votre classe à un monde de bugs subtils si jamais il est mal utilisé. Utiliser l'héritage de cette manière est un concept très fragile. Au moins utiliser l'héritage privé, http://stackoverflow.com/questions/656224/when-should-i-use-c-private-inheritance/675451#675451 est un exemple de la façon de le faire. En fin de compte, vous serez plus heureux si vous vous en tenez à la composition. –

Répondre

5

Nous n'avons pas besoin de demander l'alignement sur la classe dérivée que nous ne pouvons pas. La raison pour laquelle nous n'avons pas besoin est qu'il suffit de demander l'alignement pour la classe dérivée, et que l'alignement demandé à la classe dérivée se traduira par une mise en page pour la classe de base qui dépend du dérivé.

class A : public C __attribute__ ((aligned(16))) 
{ 


class B : public C __attribute__ ((aligned(8))) 
{ 

Qui sera l'alignement de C?

+0

Je vois votre point, attendra de voir comment d'autres pèsent dans – Anycorn

2

GCC garantit que la première classe de base est à zéro décalé dans la disposition de classe dérivée. Par conséquent, il suffit dans ce cas d'aligner l'objet dérivé.

Je ne trouve pas de bonne référence pour le moment mais je vois here sous -wABI, où ils décrivent une exception à la règle non-spécifiée: si la base est vide, elle peut ne pas être à zéro.

Je suppose qu'il y aurait une autre exception si la première base manque d'un vtable mais l'objet dérivé en a un. array tombant dans cette catégorie, je ferais attention. Bien sûr, la norme laisse la disposition non spécifiée: §10/3.

Questions connexes