Вопрос выравнивания памяти C ++ - PullRequest
5 голосов
/ 15 декабря 2010

Строка кода стоит тысячи слов :) Вот моя проблема:

/* Platform specific 16-byte alignment macro switch.
   On Visual C++ it would substitute __declspec(align(16)).
   On GCC it substitutes __attribute__((aligned (16))).
*/
#define ALIGN_16 ...

struct ALIGN_16 A {...};

A* ptr = new A;
A* ptr2 = new A[20];

assert(size_t(ptr) % 16 == 0);

for (int i=0; i<20; ++i)
    assert(size_t(ptr2+i) % 16 == 0);

assert(sizeof(A) % 16 == 0);

Можно ли ожидать, что все утверждения пройдут на платформах с поддержкой SSE?Спасибо.

РЕДАКТИРОВАТЬ.Частичный ответ.Я провел некоторые тесты с VS2008, GCC и ICC.Компилятор MS выровнял ptr и ptr2 , но GCC и ICC не удалось выровнять ptr2 .

Ответы [ 2 ]

4 голосов
/ 15 декабря 2010

Есть ли какая-либо гарантия выравнивания возврата адреса при новой операции C ++?

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

Visual C ++ 6 не выровнял doubles, выделенный через new должным образом, так что вы идете.

1 голос
/ 15 декабря 2010

C ++ 0x предоставляет новую конструкцию (в [meta.type.synop] 20.7.6.6 другие преобразования ):

std::aligned_storage<Length, Alignment>

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

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

Помимо ошибок , компилятор обязан выполнить это требование.Если у вас нет C ++ 0x, это можно найти в пространстве имен tr1 или в Boost.

. Вы единственный, кто может проверить, что ваш конкретный компилятор выполняет этот запрос:)

Примечание: для gcc-4.3.2 это реализовано как:

template<std::size_t _Len, std::size_t _Align = /**/>
struct aligned_storage
{
  union type
  {
    unsigned char __data[_Len];
    struct __attribute__((__aligned__((_Align)))) { } __align;
  };
};
...