Должен ли массив tr1 быть выровнен на 16 байтов? - PullRequest
0 голосов
/ 04 января 2012

В "gcc версии 4.2.1 (на основе Apple Inc., сборка 5658) (сборка LLVM 2335.15.00)" в массиве tr1 я вижу это:

  value_type _M_instance[_Nm ? _Nm : 1] __attribute__((__aligned__)); 

тогда как в «gcc версии 4.5.2 (Ubuntu / Linaro 4.5.2-8ubuntu4)» я вижу это:

  value_type _M_instance[_Nm ? _Nm : 1];

то есть кажется, что массивы tr1 больше не указываются как выровненные (что влияет на код SSE, написанный для них). Некоторые из наших модульных тестов не выполняются в _mm_load_ps. Есть ли где-нибудь обсуждение этого изменения?

1 Ответ

0 голосов
/ 04 января 2012

В спецификации не указано, что tr1::array выровнено по 16 байтов.Единственная гарантия состоит в том, что массив будет правильно выровнен в соответствии с размером value_type.Если размеры объектов, которые вы храните в массивах, не будут такими, что выравнивание value_type кратно 16 байтам, вы не получите 128-разрядное выравнивание, которое вы хотите использовать в инструкциях SSE.Если у вас есть существующий код, основанный на том факте, что один компилятор использовал 16-байтовое выравнивание для всех array экземпляров, вам следует исправить это.Вы пользуетесь поведением, которое превышает то, что определяет стандарт, и оно очень хрупкое.

Если у вас есть код, основанный на определенном количестве выравнивания в используемой памяти, то вам следуетявное применение этого выравнивания при выделении памяти;все, что меньше, подвержено ошибкам, если вы меняете компиляторы или платформы. Предыдущий вопрос посвящен тому, как заставить tr1::array объекты использовать выровненную память.

...