Выравнивание родительского класса C ++ - PullRequest
3 голосов
/ 01 мая 2010

Можно ли указать выравнивание родительского класса? например что-то вроде (что не компилируется):

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

спасибо

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

Ответы [ 2 ]

5 голосов
/ 01 мая 2010

Нам также не нужно запрашивать выравнивание для производного класса. Причина, по которой нам это не нужно, заключается в том, что достаточно запросить выравнивание для производного класса, и что запрос выравнивания для производного класса приведет к компоновке для базового класса, которая зависит от производного.

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


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

Какой будет выравнивание для C?

2 голосов
/ 01 мая 2010

GCC гарантирует, что первый базовый класс имеет нулевое смещение в макете производного класса. Поэтому в этом случае достаточно выровнять производный объект.

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

Полагаю, было бы еще одно исключение, если в первой базе отсутствует виртуальная таблица, а у производного объекта она есть. array попадая в эту категорию, я бы остерегался. Конечно, стандарт оставляет макет не уточненным: §10 / 3.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...