Мы тестируем под Sun Studio 12.3. Мы обнаруживаем ошибку компилятора, которой нет в 12.4 и более поздних версиях. Его нет в 12.1 и более ранних версиях, но это потому, что у компилятора проблемы с инструкциями AES. Его также нет в других компиляторах, таких как Clang, GCC, ICPC и VC++. Ошибка:
/opt/solarisstudio12.3/bin/CC -DDEBUG -g3 -xO0 -D__SSE2__ -D__SSE3__ -D__SSSE3__ \
-D__SSE4_1__ -D__SSE4std::swap(*(__m128i*)(rk), *(__m128i*)(rk+4*m_rounds));
_ -D__AES__ -D__PCLMUL__ -D__RDRND__ -D__RDSEED__ -D__AVX__ \
-D__AVX2__ -D__BMI__ -D__BMI2__ -native -m64 -KPIC -template=no%extdef -c rijndael.cpp
"/opt/solarisstudio12.3/prod/include/CC/Cstd/algorithm", line 283: Error: Cannot use vector unsigned long long[2] to initialize vector unsigned long long[2].
"rijndael.cpp", line 277: Where: While instantiating "std::swap<vector unsigned long long[2]>(unsigned long long(&)[2], unsigned long long(&)[2])".
"rijndael.cpp", line 277: Where: Instantiated from non-template code.
1 Error(s) detected.
gmake: *** [rijndael.o] Error 2
gmake: *** Waiting for unfinished jobs....
ERROR: failed to make cryptest.exe
Рассматриваемый код:
std::swap(*(__m128i*)(rk), *(__m128i*)(rk+4*m_rounds));
У меня есть пара вопросов:
- С чем у компилятора проблемы?
Как лучше всего устранить ошибку?
Я должен задать второй вопрос, потому что я не уверен в SunCC и типе __m128i
, учитывая, что я мог бы использовать необработанный memcpy
, попытаться написать свой собственный своп или даже попробовать iter_swap
без разыменования.
std::swap
с C-массивами была добавлена в C++11; Вы включили С++ 11/14 для своего компилятора? - person ildjarn   schedule 17.07.2016__m128i
непрозрачный? Должен ли я простоmemcpy
это? - person jww   schedule 17.07.2016swap
обычно создает временный объект типаT temp( b );
, гдеb
— формальный аргумент ссылочного типа. До C++11 это вызывалось для необработанных массивов как фактические аргументы. И это не компилируется (точно так же, какint x[3]; int y[3]( x );
не компилируется). - person Cheers and hth. - Alf   schedule 17.07.2016