Борьба с синтаксисом alignas

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

Например:

class A
{
private:
    int n;
    alignas(64) double* ptr;    

public:
    A(const int num) : n(num), ptr(new double[num])
    {}
};

Я надеялся, что данные для ptr будут выровнены по 64-байтовому блоку. Используя компилятор Intel, это не так.

Кто-нибудь может указать мне правильное направление, пожалуйста?

1 ответ

Решение

С использованием alignas(N) Ключевое слово члена класса приводит к выравниванию этого члена в соответствии с указанным выравниванием, а не к какой-либо сущности, на которую потенциально указывается. В конце концов, при инициализации указателя со значением отсутствует элемент управления для выравнивания уже существующих объектов.

Возможно, вы захотите взглянуть на std::align() который занимает

  1. Спецификация для выравнивания возвращаемого указателя.
  2. Размер выровненного блока.
  3. Указатель на выделенную память.
  4. Объем выделенной памяти.

Он возвращает соответственно выровненный указатель, если не хватает места для выполнения требований как выравнивания, так и размера. Если места недостаточно, функция возвращает нулевой указатель.

Другие вопросы по тегам