Подтвердить что ты не робот

Выравнивание переменных стека в D

В D вы можете выровнять элементы struct/class с помощью ключевого слова align, например:

struct Vec4 { align(16) float[4] elems; }

Однако, похоже, что вы не можете сделать то же самое в стеке:

void foo()
{
    align(16) float[4] vec; // error: found 'align' instead of statement
}

Есть ли способ выровнять данные в стеке? В частности, я хочу создать 16-байтовый выровненный массив поплавков для загрузки в регистры XMM с помощью movaps, который значительно быстрее, чем movups.

например.

void foo()
{
    float[4] v = [1.0f, 2.0f, 3.0f, 4.0f];
    asm
    {
        movaps XMM0, v; // v must be 16-byte aligned for this to work.
        ...
    }
}
4b9b3361

Ответ 1

Если вы готовы записать дополнительные 16 байт, вы можете выполнить выравнивание себя во время выполнения. Кроме того, я не знаю.