Выровненные типы и передача аргументов по значению

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

Я провожу несколько тестов с Visual Studio 2008 и не совсем уверен, когда и как передача по значению не удается. Меня больше всего беспокоит функция foo . Кажется, все работает нормально, но могло ли это быть результатом встраивания или другого совпадения? Что, если я изменю его подпись на void foo (const __m128 &) ?

Ваш вклад очень признателен. Спасибо.

struct A
{
    __m128 x;
    int n;
};

void foo(__m128);
void bar(A);

void f1()
{
    // won't compile
    // std::vector vec1(3);

    // compiles, but fails at runtime when elements are accessed
    std::vector<__m128> vec2(3);

    // this seems to work. WHY???
    std::vector<__m128, some_16_byte_aligned_allocator<__m128> > vec3(3);

    __m128 x;
    A a;

    // passed by value, is it OK?
    foo(x);

    // won't compile
    //bar(a);
}

РЕДАКТИРОВАТЬ. STL не работает даже с выровненным распределителем, потому что проблема передачи по значению остается.

Найдена эта ссылка передать __m128 по значению

12
задан Laurent Parenteau 20 December 2010 в 15:56
поделиться