Борьба с синтаксисом 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, это не так.

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

8

Решение

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

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

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

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

5

Другие решения